awk

本文详细介绍了awk命令的基础用法及高级技巧,包括指定分隔符、关键字匹配、数学运算、段落比较等,同时展示了如何利用awk进行文本处理的实际案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

awk是一个强大的文本分析工具,awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。
一、 awk的基本用法(一)
1.  awk -F   指定分隔符,当不使用-F指定分隔符时,将以空白的字符或空格为分隔符
1. [root@localhost awk]# awk -F ':' '{print $1}' pd    #-F指定分隔符为":" $1表示第一段,
    root
    bin
    daemon
2. [root@localhost awk]# awk -F ':' '{print $0}' pd      # $0表示所有的段,打印pd文件所有的段
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
3. [root@localhost awk]# awk -F ':' '{print $1,$4,$7}' pd      #打印多个段,中间用逗号","就可以
    root 0 /bin/bash
    bin 1 /sbin/nologin
    daemon 2 /sbin/nologin
4. [root@localhost awk]# awk -F ':' '{print $1"#"$4"#"$7}' pd   #指定打印出来的结果之间的分隔符
    root#0#/bin/bash
    bin#1#/sbin/nologin
    daemon#2#/sbin/nologin
2. awk  指定关键字进行匹配
[root@localhost awk]# awk '/root/' pd      #匹配出带有root的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
3. awk 指定段进行匹配,更加精确
[root@localhost awk]# awk -F ':' '$1 ~ /root/' pd  #指定分隔符为":" 只匹配第一段带有root的行
root:x:0:0:root:/root:/bin/bash
4. awk支持多个表达式一起写
1. [root@localhost awk]# awk -F ':' '/root/ {print $1,$3} /lx/ {print $1,$3,$4}' pd
    root 0                                            #匹配带有root和lx行,打印root行的1、3段,lx行的1、3、4段
    operator 11
    lx01 1000 1000
    lx02 1001 1001
    lx03 1002 1003
2. [root@localhost awk]# awk '/root|lx/ {print $0}' pd     #匹配出带有root或者lx的行,全部打印出来
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    lx01:x:1000:1000::/home/lx01:/bin/bash
    lx02:x:1001:1001::/home/lx02:/bin/bash
     lx03:x:1002:1003::/home/lx03:/bin/bash

5. awk支持数学运算符
1. [root@localhost awk]# awk -F ':' '$3==0 {print $1}' pd     #将pd文件中第3段等于0的行的第一段打印出来
    root
2. [root@localhost awk]# awk -F ':' '$3>=1000 {print $1}' pd   # 将pd文件中第3段大于等于1000的行的第一段打印出来
    lx01
    lx02
    lx03
    sdd
    mk100
3.  [root@localhost awk]# awk -F ':' '$7!="/sbin/nologin" {print $0}' pd     # 将pd文件中第7段不等于/sbin/nologin的行打印出来,使用字符串时要用双引号,数字加上双引号表示字符串
    root:x:0:0:root:/root:/bin/bash
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    lx01:x:1000:1000::/home/lx01:/bin/bash
    lx02:x:1001:1001::/home/lx02:/bin/bash
    lx03:x:1002:1003::/home/lx03:/bin/bash
    mk100:x:1007:1007::/home/mk100:/bin/bash

二 、awk用法(二)
1. awk  支持段与段之间进行比较
[root@localhost awk]# awk -F ':' '$3>$4' pd     #将pd文件中的第3段大于第4段的行打印出来
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
sdd:x:1006:1002::/home/lkh:/sbin/nologin
[root@localhost awk]# awk -F ':' '$3>"5" && $3<7 ' pd       #将pd文件中的第3段大于5,且小于7的行打印出来
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
2. awk OFS   指定print后的分隔符
[root@localhost awk]# awk -F ':' '{OFS="#"} $3>1000 || $7 ~ /bash/ {print $1,$2,$3,$7}' pd        #指定print后的分隔符为“#”
root#x#0#/bin/bash
lx01#x#1000#/bin/bash
lx02#x#1001#/bin/bash
lx03#x#1002#/bin/bash
sdd#x#1006#/sbin/nologin
mk100#x#1007#/bin/bash
3. NR      表示行号
[root@localhost awk]# awk -F ':' '{print NR"#" $0}' pd         #打印行号           
1#root:x:0:0:root:/root:/bin/bash
2#bin:x:1:1:bin:/bin:/sbin/nologin
3#daemon:x:2:2:daemon:/sbin:/sbin/nologin
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
4. NF    可以显示一行有多少段
[root@localhost awk]# awk -F ':' '{print NF"#" $0}' pd    #可以看到一行有7段
7#root:x:0:0:root:/root:/bin/bash
7#bin:x:1:1:bin:/bin:/sbin/nologin
7#daemon:x:2:2:daemon:/sbin:/sbin/nologin
7#adm:x:3:4:adm:/var/adm:/sbin/nologin
7#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7#sync:x:5:0:sync:/sbin:/bin/sync
5. NR和NF可以作为一个判断条件
1. [root@localhost awk]# awk -F ':' 'NR<=3' pd     #打印前3行
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
2. [root@localhost awk]# awk -F ':' 'NR<=10 && $1 ~ /root|sync/' pd   #支持多个条件
    root:x:0:0:root:/root:/bin/bash
    sync:x:5:0:sync:/sbin:/bin/sync
6. awk 赋值
[root@localhost awk]# head -n3 /etc/passwd |awk -F ':' '$1="root"'      #前三行的第一段全部变为root
root x 0 0 root /root /bin/bash
root x 1 1 bin /bin /sbin/nologin
root x 2 2 daemon /sbin /sbin/nologin
7. 求和一列
[root@localhost awk]# awk -F ':' '{tot=tot+$3}; END {print tot}' pd
7621
8. awk的判断语句
[root@localhost awk]# awk -F ':' '{if($1=="root") {print $0}}' pd   #如果第一段等于0,那么将那一行打印出来
root:x:0:0:root:/root:/bin/bash


习题:
1. 用awk 打印整个test.txt 
awk '{print $0}' test.txt

2. 查找所有包含 ‘bash’ 的行
awk '/bash/' test.txt

3. 用 ‘:’ 作为分隔符,查找第三段等于0的行
awk -F ':' '$3==0 {print $0}' test.txt

4. 用 ‘:’ 作为分隔符,查找第一段为 ‘root’ 的行,并把该段的 ‘root’ 换成 ‘toor’ (可以连同sed一起使用)
awk -F ':' '$1=="root" {print $0}' test.txt |sed 's/root/toor/g'

5.用 ‘:’ 作为分隔符,打印最后一段
awk -F ':' '{print $NF}' test.txt

6.打印行数大于20的所有行
awk 'NR>20 {print $0}' test.txt

7.用 ‘:’ 作为分隔符,打印所有第三段小于第四段的行
awk -F ':' '$3<$4 {print $0}' test.txt

8. 用 ‘:’ 作为分隔符,打印第一段以及最后一段,并且中间用 ‘@’ 连接 (例如,第一行应该是这样的形式  'root @ /bin/bash ‘ )
awk -F ':' '{OFS="@"} {print $1,$NF}' test.txt

9.用 ‘:’ 作为分隔符,把整个文档的第四段相加,求和
awk -F ":" '{tot4=tot4+$4}; END {print tot4}' test.txt






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值