Linux的awk学习

awk命令:

awk [option] 'pattern[action]' file 
    [option]为可选项参数
    pattern为模式
    [action]为执行动作,一般有print和printf
    file则为文件

awk的内置变量:
    $n    指定分隔符(如$1指的是第一个字段,$2指的是第二个字段,$NF则是最后一个字段)
    $0    默认指的是全文
    FS    字段分割符,默认为空格
    NF    分割后,当前行有多少个字段
    NR    当前记录行数

awk的内置函数学习:

[root@ths /]# sed -n '1,5p' lianxin | awk -F ':' '{print $1,$2,$NF}'  
root x /bin/bash
bin x /sbin/nologin
daemon x /sbin/nologin
adm x /sbin/nologin
lp x /sbin/nologin
#首先打印出lianxin的前五行,使用awk罗列出第一,第二和最后一列(区别的分割符为:)

[root@ths /]# sed -n '1,5p' lianxin | awk -F ':' '{print $NF,$1}'          
/bin/bash root
/sbin/nologin bin
/sbin/nologin daemon
/sbin/nologin adm
/sbin/nologin lp
#需要注意的是awk的文本处理是根据$的排序进行打印输出的

[root@ths /]# sed -n '1,5p' lianxin | awk -F ':' '{print "最后一列",$NF,"第一列",$1}'    
最后一列 /bin/bash 第一列 root
最后一列 /sbin/nologin 第一列 bin
最后一列 /sbin/nologin 第一列 daemon
最后一列 /sbin/nologin 第一列 adm
最后一列 /sbin/nologin 第一列 lp
#也可以在$输出前加上相关的参数说明(需要注意的是,在内层增加参数需要使用"")

[root@ths /]# sed -n '1,5p' lianxin | awk -F ':' '{print "第一列",$1,"倒数第二列",$(NF-1)}'      
第一列 root 倒数第二列 /root
第一列 bin 倒数第二列 /bin
第一列 daemon 倒数第二列 /sbin
第一列 adm 倒数第二列 /var/adm
第一列 lp 倒数第二列 /var/spool/lpd
#$NF表示最后一行,$(NF-1)则是表示倒数第二行

[root@ths /]# sed -n '1,5p' lianxin | awk -F ':' '{print "这一行有:"NF"个字符","第一列",$1,"倒数第二列",$(NF-1)}'     
这一行有:7个字符 第一列 root 倒数第二列 /root
这一行有:7个字符 第一列 bin 倒数第二列 /bin
这一行有:7个字符 第一列 daemon 倒数第二列 /sbin
这一行有:7个字符 第一列 adm 倒数第二列 /var/adm
这一行有:7个字符 第一列 lp 倒数第二列 /var/spool/lpd
#通过""在awk中增加对应的文本注释,通过","来区分不同的符号文本

Awk的参数:
-F    指定分割字段
-v    定义/修改awk的一个内部变量
-f    从脚本中读取awk命令

[root@ths /]# sed -n '1,5p' lianxin | awk -F ':' '{print "这一行有:"NF"个字符","第一列",$1,"倒数第二列",$(NF-1),"通过:来进行划分"}'      
这一行有:7个字符 第一列 root 倒数第二列 /root 通过:来进行划分
这一行有:7个字符 第一列 bin 倒数第二列 /bin 通过:来进行划分
这一行有:7个字符 第一列 daemon 倒数第二列 /sbin 通过:来进行划分
这一行有:7个字符 第一列 adm 倒数第二列 /var/adm 通过:来进行划分
这一行有:7个字符 第一列 lp 倒数第二列 /var/spool/lpd 通过:来进行划分
#NF表示有一行有多少个字符,$表示输出对应的列,-F则表示通过什么符进行区分

[root@ths /]# awk  'NR==5,NR==7' lianxin 
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
#打印lianxin的第5到7行

[root@ths /]# awk -F ':' '{print NR,"这一行有:"NF"个字符","第一列",$1,"倒数第二列",$(NF-1),"通过:分"}'  lianxin | awk NR==5,NR==10 
5 这一行有:7个字符 第一列 lp 倒数第二列 /var/spool/lpd 通过:分
6 这一行有:7个字符 第一列 sync 倒数第二列 /sbin 通过:分
7 这一行有:7个字符 第一列 shutdown 倒数第二列 /sbin 通过:分
8 这一行有:7个字符 第一列 halt 倒数第二列 /sbin 通过:分
9 这一行有:7个字符 第一列 mail 倒数第二列 /var/spool/mail 通过:分
10 这一行有:7个字符 第一列 operator 倒数第二列 /root 通过:分
#管道符前通过增加NR来对lianxi的文本提取出的行进行罗列,管道符后通过NR打印5-10行

 awk的函数输入与输出符:

awk有输入和输入两种分割符,其中awk的输入分割符默认为空格,输出分割符则没有定义
    输入分割符定义为FS,输出分割符为0FS

修改awk的默认输入分隔符方式有两种,一种为-F,另外一种则是-v FS=''

eg:
[root@ths /]# awk -F ':' 'NR==1,NR==5 {print $1,$2}' lianxin 
root x
bin x
daemon x
adm x
lp x

[root@ths /]# awk -F ':' -v 'OFS=分隔符' 'NR==1,NR==5 {print $1,$2}' lianxin   
root分隔符x
bin分隔符x
daemon分隔符x
adm分隔符x
lp分隔符x
#OFS使用中文也可以

[root@ths /]# awk -v 'FS=:' -v 'OFS=#'  'NR==1,NR==5 {print $1,$2}' lianxin        
root#x
bin#x
daemon#x
adm#x
lp#x
#输入使用空格进行划分,输出使用#进行划分

[root@ths /]# awk -v 'FS=:' -v 'OFS=\t'  'NR==5,NR==10 {print NR,$1,$2}' lianxin  
5       lp      x
6       sync    x
7       shutdown        x
8       halt    x
9       mail    x
10      operator        x
#OFS同样也可以匹配使用\t


AWk除了有内置的输入分割字符,同样还有换行字符RS
[root@ths /]# awk -v 'RS=:' -v 'ORS=//' 'NR==5,NR==10 {print FNR,$1,$2,FILENAME}' lianxin 
5 root  lianxin//6 /root  lianxin//7 /bin/bash bin lianxin//8 x  lianxin//9 1  lianxin//10 1  lianxin//

同样的awk还内置换行符ORS
[root@ths /]# awk -v 'FS=:' -v 'OFS=---'  -v 'ORS=//'    'NR==5,NR==10 {print FNR,$1,$2,FILENAME}' lianxin     
5---lp---x---lianxin//6---sync---x---lianxin//7---shutdown---x---lianxin//8---halt---x---lianxin//9---mail---x---lianxin//10---operator---x---lianxin//


awk的内置函数FILENAME同样也是用来标定文件的(文件的来源)
[root@ths /]# awk -v 'FS=:' -v 'OFS=---' ' {print FNR,$1,$2,FILENAME}' lianxin hehe  | sed '15,25p' -n 
15---dbus---x---lianxin
16---polkitd---x---lianxin
17---sshd---x---lianxin
18---postfix---x---lianxin
19---chrony---x---lianxin
20---lxb---x---lianxin
21---ntp---x---lianxin
1---root---x---hehe
2---bin---x---hehe
3---daemon---x---hehe
4---adm---x---hehe

awk的BEGIN和END:

[root@ths /]# awk -v FS=: 'BEGIN{print "nihao"}NR==5{print $1,$2,$NF}END{print "end"}' lianxin   
nihao
lp x /sbin/nologin
end
#awk的执行顺序为:begin-print($)-end

[root@ths /]# awk -v FS=: 'END{print "nihao"}NR==5{print $1,$2,$NF}BEGIN{print "end"}' lianxin      
end
lp x /sbin/nologin
nihao

[root@ths /]# awk -F ':' -v 'OFS= ' '$1=="lxb"{print NR,$1,$2}' lianxin 
20 lxb x
#输出第一参数为lxb的那一行的第一和第二给参数

awk和正则表达式:

[root@ths /]# awk 'NR>=4 && NR<=8 {print NR,$0}' lianxin 
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
#打印输出第4到第八行的数据

[root@ths /]# awk '/\/sbin\/nologin$/{print $0}' lianxin 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
#使用awk+正则匹配出/sbin/nologin的行

[root@ths /]#  awk '/^mail/,/^nobody/ {print $0}' lianxin 
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
#使用awk+正则匹配出以mail开头的行到以nobody开头的行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值