Linux命令笔记二:Linux命令(二)

2019-11-20  本文已影响0人  开发者连小超

一、grep和正则表达式

1.grep

参数

-v:反显示
-e:使用扩展正则表达式

实例

#输出profile文件里包含after的行
grep after profile

#输出profile文件里不包含after的行
grep -v after profile

2.正则表达式

匹配操作符
    \                    转义字符
    .                    匹配任意单个字符
    [1249a],[^12],[a-k]  字符序列单字符占位
    ^                    行首
    $                    行尾
    \<,\>:\<abc         单词首尾边界
    |                    连接操作符
    (,)                  选择操作符
    \n                   反向引用

重复操作符:
    ?       匹配0到1次。
    *       匹配0到多次。
    +       匹配1到多次。
    {n}     匹配n次。
    {n,}    匹配n到多次。
    {n,m}   匹配n到m次。
    与扩展正则表达式的区别:grep basic
    \?, \+, \{, \|, \(, and \)
    匹配任意字符
    .*

实例

#查询包含ooxx的行
grep "ooxx" grep.txt

#查询包含ooxx单词的行
grep "\<ooxx\>" grep.txt

#查询以ooxx开头的行
grep "^ooxx" grep.txt

#查询以ooxx单词开头的行
grep "^ooxx\>" grep.txt

#查询包含数字的行
grep "[0-9]"  grep.txt

#查询包含4-8的行
grep "[4-8]"  grep.txt

#查询一行规则的出现ooxx
grep "ooxx.*ooxx"  grep.txt

grep "\(oo\)\(xx\).*\1\2"  grep.txt
\1 第一个小括号内容 \2第二个小括号内容

二、文本处理命令cut、sort、wc、sed、awk

1.cut 显示切割的行数据

参数

-f:选择显示的列
-s:不显示没有分隔符的行
-d:自定义分隔符

实例

cut -d' ' -f1 grep.txt (不能被切割的行每次都出现,加-s解决)
cut -s -d' ' -f1 grep.txt
cut -s -d' ' -f1,3 grep.txt
cut -s -d' ' -f1-3 grep.txt

2.sort 排序文件的行(包括数值序,字典序。默认字典序)

参数

-n:按数值排序
-r:倒序
-t:自定义分隔符
-k:选择排序列
-u:合并相同行
-f:忽略大小写

实例

sort -t' ' -k2  sort.txt  #默认字典序
sort -t' ' -k2 -n sort.txt  #-n表示按照数值序
sort -t' ' -k2 -nr sort.txt  #-r倒序

3.wc 统计行数

wc -l sort.txt
cat sort.txt | wc -l
ls -l /etc/ | wc -l

4.sed 行编辑器(相当于vi的末行模式拆出来)

语法 sed [options] 'AddressCommand' file ...

参数

-n: 静默模式,不再默认显示模式空间中的内容
-i: 直接修改原文件
-e: SCRIPT -e SCRIPT:可以同时执行多个脚本
-f: /PATH/TO/SED_SCRIPT
-r: 表示使用扩展正则表达式

行编辑器Command

d 删除符合条件的行;
p 显示符合条件的行;
a \string: 在指定的行后面追加新行,内容为string
    \n:可以用于换行
i \string: 在指定的行前面添加新行,内容为string
r FILE: 将指定的文件的内容添加至符合条件的行处
w FILE: 将地址指定的范围内的行另存至指定的文件中; 
s/pattern/string/修饰符: 查找并替换,默认只替换每行中第一次被模式匹配到的字符串
g 行内全局替换
i 忽略字符大小写
s///: s###, s@@@    
     \(\), \1, \2

实例

#在第一行下面插入hello world
sed "1a\hello world"  sort.txt  (此时源文件没有发生变化 )
sed -i "1a\hello world"  sort.txt  (加上-i源文件就变化了)

#删掉hello world
sed -i "2d" sort.txt

#删掉带数字的行
sed -i "/[0-9]/d" sort.txt

#包含数字的行打印出来,其他行不显示
sed -n "/[0-9]/p" sort.txt
        
#查找替换实例,扩大查找范围至精确匹配
sed "s/id:[0-6]:initdefault/id:5:initdefault/ig" inittab
#圈定元素
sed "s/\(id:\)[0-6]\(:initdefault\)/\15\2/ig" inittab

5.awk 一个强大的文本分析工具

awk就是把文件逐行的读入,(空格,制表符)为默认分隔符将每行切片,切开的部分再进行各种分析处理。注意:天生对空白符敏感,空白符不用去切。

语法 awk -F '{pattern + action}' {filenames} (注意必须是单引号)

-支持自定义分隔符
-支持正则表达式匹配
-支持自定义变量,数组 a[1] a[tom] map(key)
-支持内置变量

ARGV               命令行参数排列
ENVIRON            支持队列中系统环境变量的使用
FILENAME           awk浏览的文件名
FNR                浏览文件的记录数
FS                 设置输入域分隔符,等价于命令行 -F选项
NF                 浏览记录的域的个数
NR                 已读的记录数
OFS                输出域分隔符
ORS                输出记录分隔符
RS                 控制记录分隔符

-支持函数 print、split、substr、sub、gsub
-支持流程控制语句,类C语言 if、while、do/while、for、break、continue

实例

#只显示用户列(第一列),冒号分割
awk  -F ':' '{print $1}'  passwd
        
#只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,
#而且在所有行开始前添加列名name,shell,在最后一行添加"end"
awk  -F ':' 'BEGIN{print "name\tshell"} {print $1 "\t" $7} END{print "end"}'  passwd
        
#搜索/etc/passwd有root关键字的所有行
awk '/root/{print $0}' passwd  (每一行匹配root才会调用{打印}方法)
awk '/root/{print $0} {print $0}' passwd  (此时每行匹配上了就会调2次打印)
        
#统计/etc/passwd文件中,每行的行号,每行的列数,对应的完整行内容
awk  -F':' '{print NR"\t"NF"\t"$0}' passwd


文件 awk.txt
Tom      0   2012-12-11      car     3000
John     1   2013-01-13      bike    1000
vivi     1   2013-01-18      car     2800
Tom      0   2013-01-20      car     2500
John     1   2013-01-28      bike    3500
#0:manager,1:worker

#1.合计每人1月份工资
awk '{
  split($3,data,"-");
    if(data[2]=="01"){name[$1]+=$5}
  } 
  END{
    for(i in name){print i"\t"name[i]}
}' awk.txt

#2.合计每人1月份工资,每行带角色
awk '{
  split($3,data,"-");
    if(data[2]=="01"){name[$1]+=$5};
    if($2=="0"){role[$1]="M"}else{role[$1]="W"}
  }END{
    for(i in name){print i"\t"name[i]"\t"role[i]}
}' awk.txt
上一篇下一篇

猜你喜欢

热点阅读