awk 截取符合复杂条件的列命令

命令语法awk 条件1 {动作1} 条件2 {动作2}...文件名
命令条件:
 一般使用关系表达式作为条件
 x > 10  判断变量x是否大于10
 x >= 10 判断变量是否大于等于10
 x <= 10 判断变量是否小于等于10
命令动作:
 格式化输出 ({printf $n},表示输出第n列;$n表示第n列)
 流程控制语句
命令作用:awk是一个复杂的命令,可以在里面进行编程等复杂的操作。
示例:
[root@192 cut]# cat score.txt
Id	Name	Gender	Score
1	zhangsan	M	90
2	lisi	M	88
3	wangwu	M	98
4	zhaoliu	N	97
5	NangongYi	M	100
实例:使用awk命令格式输出第2,4列内容
[root@192 cut]# awk '{printf $2 "\t" $4 "\n"}' score.txt
Name	Score
zhangsan	90
lisi	88
wangwu	98
zhaoliu	97
NangongYi	100
[root@192 cut]#
注意:awk提取列,它是先提取第一行的第2,4列,然后,提取第二行的第2,4列,接着第三行的第2,4列,一直到文本结束。
实例:我要获取当前系统的根目录的磁盘空间大小
[root@192 cut]# df -h
文件系统	      容量  已用  可用 已用%% 挂载点
/dev/sda3              17G  2.6G   14G  17% /
tmpfs                 499M     0  499M   0% /dev/shm
/dev/sda1             985M   40M  896M   5% /boot

A、先提取df -h 命令输出的第一行
[root@192 cut]# df -h | grep sda3
/dev/sda3              17G  2.6G   14G  17% /
[root@192 cut]#

B、再提取A结果的第五列
[root@192 cut]# df -h | grep sda3 | awk '{print $5}'
17%
[root@192 cut]#

C、以”%”为分隔符,获取第一个元素
[root@192 cut]# df -h | grep sda3 | awk '{print $5}' | cut -d "%" -f 1
17
[root@192 cut]#
BEGIN
作用:是个条件,只有满足了BEGIN这个条件,才开始执行。表示,在所有输出之前,输出BEGIN后的内容。再处理其他动作。
实例:awk 'BEGIN {printf "this is new begin!\n"} {printf $2 "\t" $4 "\n"}' score.txt
[root@192 cut]# awk 'BEGIN {printf "this is new begin!\n"} {printf $2 "\t" $4 "\n"}' score.txt
this is new begin!
Name	Score
zhangsan	90
lisi	88
wangwu	98
zhaoliu	97
NangongYi	100
[root@192 cut]#
那么BEGIN的作用到底是在哪里?往下看:

FS内置变量:定义分隔符

作用:指定分隔符
实例:从passwd文件中获取所有的非系统用户- cat /etc/passwd | grep "/bin/bash" | awk '{FS=":"} {printf $1 "\t" $3 "\n"}'
[root@192 cut]# cat /etc/passwd | grep "/bin/bash" | awk '{FS=":"} {printf $1 "\t" $3 "\n"}'
root:x:0:0:root:/root:/bin/bash
user1	500
user2	501
user3	502
[root@192 cut]#
仔细观察:我们发现,第一行也被输出出来了。这是为什么呢?原来,awk是先读入第一行数据,然后,再执行命令操作。
实例:从passwd文件中获取所有的非系统用户,并去掉第一行- cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN {FS=":"} {printf $1 "\t" $3 "\n"}'
[root@192 cut]# cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN {FS=":"} {printf $1 "\t" $3 "\n"}'
root	0
user1	500
user2	501
user3	502
[root@192 cut]#
注意:
1、awk默认能够识别的分隔符是“空格”、“制表符”,但是,现实中,我们见到的分隔符,可能不止这几个,需要我们根据实际情况,进行指定,这时,就用到FS了,它是awk命令中用来指定分隔符的变量。
2、BEGIN表示在读入第一行数据之前,就先把分隔符写入操作,然后,再来处理,这样,第一行数据,就被处理了。手动分割,一般与FS并存。
END
作用:在命令执行完后,输出END标识的字符内容。
实例:从score.txt文件,获取第2,4列,并在最后输出“The End”- awk 'END {printf "The End\n"} {printf $2 "\t" $4 "\n"}' score.txt
[root@192 cut]# awk 'END {printf "The End\n"} {printf $2 "\t" $4 "\n"}' score.txt
Name	Score
zhangsan	90
lisi	88
wangwu	98
zhaoliu	97
NangongYi	100
The End
[root@192 cut]#
关系运算符
实例:从score.txt文件中获取分数100分的用户
A、过滤掉不用的行 cat score.txt | grep -v Name
[root@192 cut]# cat score.txt | grep -v Name
1	zhangsan	M	90
2	lisi	M	88
3	wangwu	M	98
4	zhaoliu	N	97
5	NangongYi	M	100
[root@192 cut]#

B、对第4列运算,结果输出第2列  cat score.txt | grep -v Name | awk '$4>=100 {printf $2 "\n"}'
[root@192 cut]# cat score.txt | grep -v Name | awk '$4>=100 {printf $2 "\n"}'
NangongYi
[root@192 cut]#
Logo

更多推荐