一、awk命令
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具, 属于数据处理引擎,基于模式匹配检查输入文本,逐行处理并输出。通常用在Shell脚本中,获取指定的数据,单独使用时,可对文本数据做统计。
1、awk语法格式
- 格式1:前置命令 | awk [选项] ‘条件{编辑指令}' 文件
- 格式2:awk [选项] ‘条件{编辑指令}' 文件
- 格式3:awk [选项] ' BEGIN{编辑指令 } {编辑指令} END{编辑指令}' 文件
2、常用的选项
-F:指定分隔符,可以指定多个,可省略(默认空格或Tab位)
-V:调用外部变量 variable
3、awk内置变量
FS :保存或设置字段分隔符,如FS=”:”
$n :指定分隔的第n个字段,如、3分别表示第1、第3列
$0 :当前读入的整行文本内容
NF :记录当前处理行的字段个数(列数)
NR :记录当前已读入行的数量(行数)
FNR :当前行在源文件中的行号
4、案例
a.log内容如下:
aaaaaaaaaa,bbbbbbbbbbbb,cccccccaaaaaaaaaa,bbbbbbbbbbbb,cccccccaaaaaaaaaa,bbbbbbbbbbbb,ccccccc
- 取出a.log文件按(,)分隔后的第一列
awk -F "," '{print $1}' a.log
输出:
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
b.log内容如下:
I am mike,my mobile is 88848
- 如果要取出mike和88848
awk -F '[ ,]+' '{print $3" "$7}' b.log #指定了空格和,号为分隔符
输出
mike 88848
- 查看c.log文件第2到第3行的内容
awk '{if(NR>=2 && NR<=3) print $0}' c.log
- 统计用户有多少个
awk '{count++;print $0;} END{print "user count is ",count}' /etc/passwd
- BEGIN和END代码块
awk -F":" 'BEGIN{print "开始处理前执行该语句,一般是初始化变量"}{ print "username: " $1 "}END{print "处理结束后执行该语句,一般用于统计"}' /etc/passwd
输出:
开始处理前执行该语句,一般是初始化变量
username: root
username: XXXXX
username: XXX
username: XXXXX
处理结束后执行该语句,一般用于统计
二、sort命令
sort命令将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
1、sort语法格式
sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]
2、常用选项
-f :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b :忽略最前面的空格符部分;
-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n :使用『纯数字』进行排序(默认是以文字型态来排序的);
-r :反向排序;
-u :就是 uniq ,相同的数据中,仅出现一行代表;
-t :分隔符,默认是用 [tab] 键来分隔;
-k :以那个区间 (field) 来进行排序的意思
3、案例
a.log文件内容
apple,5,2.6
orange,8,8
banana,3,7.2
pear,6,4
[www@test /]$ sort a.log
apple,5,2.6
banana,3,7.2
orange,8,8
pear,6,4
[www@test /]$ sort -r a.log
pear,6,4
orange,8,8
banana,3,7.2
apple,5,2.6
[www@test /]$ sort -t , -k 2 a.log #用,号分割,按第二列排序
banana,3,7.2
apple,5,2.6
pear,6,4
orange,8,8
三、uniq命令
uniq命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用。也就是说,为了使uniq起作用,所有的重复行必须是相邻的。
1、uniq语法格式
uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]
2、常用参数
-i :忽略大小写字符的不同;
-c :进行计数
-u :只显示唯一的行
3、案例
b.log内容
banana,3,7.2
apple,5,2.6
pear,6,4
orange,8,9
apple,5,2.6
banana,3,7.2
[www@test /]$ uniq -c b.log #必须是相邻的相同行才会统计
1 banana,3,7.2
1 apple,5,2.6
1 pear,6,4
1 orange,8,9
1 apple,5,2.6
1 banana,3,7.2
[www@test /]$ sort b.log |uniq -c #结合sort命令
2 apple,5,2.6
2 banana,3,7.2
1 orange,8,9
1 pear,6,4
www@test /]$
四、wc命令
用于统计字数。
1、wc语法格式
wc [-clw][--help][--version][文件...]
2、常用参数
-l :仅列出行;
-w :仅列出多少字(英文单字);
-m :多少字符;
3、案例
www@test /]$ wc -l b.log #统计b.log文件行数
6 b.log
www@test /]$
五、xargs命令
xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就了 xargs 命令
1、xargs命令格式
somecommand |xargs -item command
2、常用选项
- -a file 从文件中读入作为 stdin
- -e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
- -p 当每次执行一个argument的时候询问一次用户。
- -n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
- -t 表示先打印命令,然后再执行。
- -i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
- -r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
- -s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数。
- -L num 从标准输入一次读取 num 行送给 command 命令。
- -l 同 -L。
- -d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。
- -x exit的意思,主要是配合-s使用。
3、案例
#a.log内容
a b c d e f g h i j k l m n o p q r s t u v w x y z
www@test /]$ cat a.log | xargs -n3 #-n 选项多行输出
a b c
d e f
g h i
j k l
m n o
p q r
s t u
v w x
y z
#
www@test /]$ echo "name#name#name#name" | xargs -d# #-d 选项可以自定义一个定界符
name name name name
www@test /]$ echo "name#name#name#name" | xargs -d# -n2
name name
name name
#xargs 的一个选项 -I,使用 -I 指定一个替换字符串 {},这个字符串在 xargs 扩展时会被替换掉,当 -I 与 xargs 结合使用,每一个参数命令都会被执行一次:
www@test /]$ cat a.log | xargs -I {} echo {}
apple,5,2.6
orange,8,8
banana,3,7.2
pear,6,4
六、grep命令
grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
1、grep命令格式
grep [-acinv] [--color=auto] '搜寻字符串' filename
2、常用选项
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
--color=auto :可以将找到的关键词部分加上颜色的显示
3、案例
#a.log内容
xxxxxxxxxxxxxxxx
xxxxxxxxxxx,user_id=999,xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxx,name=Lan,xxxxxxxxxxxxxxxxx
xxxxxxxxxxx,user_id=999,xxxxx
$ grep -n --color=auto "999" a.log
2:xxxxxxxxxxx,user_id=999,xxxxxxxxxxxxxxxx
6:xxxxxxxxxxx,user_id=999,xxxxx
$ grep -c --color=auto "999" a.log
2
$ grep -i --color=auto "lan" a.log
xxxxxxxxxxxxxxx,name=Lan,xxxxxxxxxxxxxxxxx
$ grep -i --color=auto "此处可以写正则表达式" a.log
欢迎大家关注我的订阅号,会定期分享一些关于软件测试相关的文章,有问题也欢迎一起讨论学习!
\