Linux - 截取符合复杂条件的列命令 awk
awk 截取符合复杂条件的列命令命令语法:awk ‘条件1 {动作1} 条件2 {动作2}...’文件名命令条件:一般使用关系表达式作为条件x > 10判断变量x是否大于10x >= 10 判断变量是否大于等于10x <= 10 判断变量是否小于等于10命令动作:格式化输出 ({printf $n},表示输出第n列;$n表示第n列)流程控制语...
·
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]#
更多推荐
已为社区贡献1条内容
所有评论(0)