003-awk 命令使用

Posted xuefy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了003-awk 命令使用相关的知识,希望对你有一定的参考价值。

awk 命令使用

截取符合条件的列

awk 先读取第一行后,再去处理数据

例子:
cut 不能截取分隔符为空格,tab之类的文件或字符串,但awk可以
[[email protected] lianxi]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   17G  1.5G   16G    9% /
devtmpfs                 1.9G     0  1.9G    0% /dev
tmpfs                    1.9G     0  1.9G    0% /dev/shm
tmpfs                    1.9G   12M  1.9G    1% /run
tmpfs                    1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1               1014M  189M  826M   19% /boot
tmpfs                    378M     0  378M    0% /run/user/0

[[email protected] lianxi]# df -h | cut -d " " -f 5








[[email protected] lianxi]# 
[[email protected] lianxi]# awk printf $2 "\t" $6 student.txt 
Name    AverageLiming    87.66Sc    85.66Gao    91.66[[email protected] lianxi]# awk printf $2 "\t" $6\n student.txt 
awk: cmd. line:1: printf $2 "\t" $6\n
awk: cmd. line:1:                   ^ backslash not last character on line
awk: cmd. line:1: printf $2 "\t" $6\n
awk: cmd. line:1:                   ^ syntax error
[[email protected] lianxi]# awk printf $2 "\t" $6 "\n" student.txt 
Name    Average
Liming    87.66
Sc    85.66
Gao    91.66

##############################################################################
解释:$2 $6 代表文件的第2列和第6列,awk先读取文件的一行,并判断条件提取符合条件的信息,再读取下一行提取
$0 代表整行



[[email protected] lianxi]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   17G  1.5G   16G    9% /
devtmpfs                 1.9G     0  1.9G    0% /dev
tmpfs                    1.9G     0  1.9G    0% /dev/shm
tmpfs                    1.9G   12M  1.9G    1% /run
tmpfs                    1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1               1014M  189M  826M   19% /boot
tmpfs                    378M     0  378M    0% /run/user/0
[[email protected] lianxi]# df -h | awk printf $6 "\t" $2 "\n"
挂载点    容量
/    17G
/dev    1.9G
/dev/shm    1.9G
/run    1.9G
/sys/fs/cgroup    1.9G
/boot    1014M
/run/user/0    378M

[[email protected] lianxi]# df -h | awk print $6 "\t" $2
挂载点    容量
/    17G
/dev    1.9G
/dev/shm    1.9G
/run    1.9G
/sys/fs/cgroup    1.9G
/boot    1014M
/run/user/0    378M

############################################
print与printf的区别
print 默认行尾自动添加换行符,printf需要手动添加



[[email protected] lianxi]# df -h | grep sda1
/dev/sda1               1014M  189M  826M   19% /boot
[[email protected] lianxi]# df -h | grep sda1 | awk print $5 | cut -d "%" -f 1
19


##################################
    BEGIN

[[email protected] lianxi]# awk BEGIN print "这是一个测试脚本" print $2 "\t" $6 student.txt 
这是一个测试脚本
Name    Average
Liming    87.66
Sc    85.66
Gao    91.66


解释:只有满足了条件才能执行后面,也就是说先执行BEGIN语句后,再处理后面的数据。





############################################
        FS 内置变量
作用:指定分隔符

[[email protected] lianxi]# awk FS=":" print $1 "\t" $3 /etc/passwd
root:x:0:0:root:/root:/bin/bash    
bin    1
daemon    2
adm    3
lp    4
sync    5
shutdown    6
halt    7
mail    8
operator    11
games    12
ftp    14
nobody    99
systemd-network    192
dbus    81
polkitd    999
sshd    74
postfix    89
chrony    998
apache    48
zabbix    997
mysql    27
user1    1000
user2    1001
user3    1002

为什么第一行没有过滤?
因为:awk 先读取第一行后,再去处理数据
解决办法:再分隔符前添加BEGIN,这样先执行分隔符后,再读取第一行,并执行数据处理
注意:手工添加分隔符必须添加BEGIN

[[email protected] lianxi]# awk BEGIN FS=":" print $1 "\t" $3 /etc/passwd
root    0
bin    1
daemon    2
adm    3
lp    4
sync    5
shutdown    6
halt    7
mail    8
operator    11
games    12
ftp    14
nobody    99
systemd-network    192
dbus    81
polkitd    999
sshd    74
postfix    89
chrony    998
apache    48
zabbix    997
mysql    27
user1    1000
user2    1001
user3    1002
[[email protected] lianxi]# 


[[email protected] lianxi]# awk BEGIN FS=":" print $1 "\t" $3 END print "aaaaaaaaa" /etc/passwd
root    0
bin    1
daemon    2
adm    3
lp    4
sync    5
shutdown    6
halt    7
mail    8
operator    11
games    12
ftp    14
nobody    99
systemd-network    192
dbus    81
polkitd    999
sshd    74
postfix    89
chrony    998
apache    48
zabbix    997
mysql    27
user1    1000
user2    1001
user3    1002
aaaaaaaaa





[[email protected] lianxi]# awk BEGIN print "开始执行" BEGIN FS=":" print $1 "\t" $3 END print "结束了" /etc/passwd
开始执行
root    0
bin    1
daemon    2
adm    3
lp    4
sync    5
shutdown    6
halt    7
mail    8
operator    11
games    12
ftp    14
nobody    99
systemd-network    192
dbus    81
polkitd    999
sshd    74
postfix    89
chrony    998
apache    48
zabbix    997
mysql    27
user1    1000
user2    1001
user3    1002
结束了




###################################################################
        关系运算符
        
[[email protected] lianxi]# cat student.txt | grep -v Name
1    Liming    82    95    86    87.66
2    Sc    74    96    87    85.66
3    Gao    99    83    93    91.66
[[email protected] lianxi]# cat student.txt | grep -v Name | awk $6 >=86 print $2
Liming
Gao


解释:查看student.txt 文件,取出不含Name的行,如果第6列的数据大于等于86,则打印第2列数据

 

以上是关于003-awk 命令使用的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——cli的终端命令大全

VSCode自定义代码片段4——cli的终端命令大全

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

sql [SQL查询片段]用于在命令行或通过R和其他工具使用SQL的快速代码段#tags:sql,R,text processing,命令li

arx代码片段