前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >9.6 awk(上)

9.6 awk(上)

作者头像
运维小白
发布2018-02-06 11:25:17
6720
发布2018-02-06 11:25:17
举报
文章被收录于专栏:运维小白

awk工具

  • head -n2 test.txt|awk -F ':' '{print $1}'
  • head -n2 test.txt|awk -F ':' '{print $0}'
  • awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
  • awk '/oo/' test.txt
  • awk -F ':' '$1 ~/oo/' test.txt
  • awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txt
  • awk -F ':' '$3=="0"' /etc/passwd
  • awk -F ':' '$3>="500"' /etc/passwd
  • awk -F ':' '$3>=500' /etc/passwd
  • awk -F ':' '$7!="/sbin/nologin"' /etc/passwd

awk功能前的准备工作

  • awk比sed更丰富的功能是,支持分段
代码语言:javascript
复制
[root@hf-01 ~]# mkdir awk
[root@hf-01 ~]# cd awk
[root@hf-01 awk]# cp /etc/passwd ./test.txt
[root@hf-01 awk]# ls
test.txt

awk命令 指定分割符

  • awk -F ':' '{print $1}' test.txt //打印出第一段内容
    • 分割符为 :
  • head -n3 test.txt |awk -F ':' '{print $1}' //在文件前3行中,打印第一段内容
代码语言:javascript
复制
[root@hf-01 awk]# awk -F ':' '{print $1}' test.txt    //打印出第一段内容
root
bin
daemon
adm
lp
sync
shutdown
halt
等等等,只截取了一小部分

[root@hf-01 awk]# head -n3 test.txt |awk -F ':' '{print $1}'
root
bin
daemon
[root@hf-01 awk]# 

awk命令以分隔符为例,打印出第一段内容——>实际上并未去改变文件内容

awk命令 指定打印某一段
  • awk -F ':' '{print $0}' test.txt //打印出所有的段
代码语言:javascript
复制
[root@hf-01 awk]# awk -F ':' '{print $0}' test.txt
root:x:0:0:root:/root:/bin/bash
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
sync:x:5:0:sync:/sbin:/bin/sync
等等等,只截取了一小部分
[root@hf-01 awk]# 
  • 打印第一段用 $1 表示
  • 打印所有的段用 $0 表示
awk命令 指定打印多段内容,并指定以什么为分割
  • awk -F ':' '{print $1,$2,$4}' test.txt //打印指定的分段,第一段,第二段,第四段
    • 在打印多段内容的时候,只需要加 , 逗号 继续添加即可
  • awk -F ':' '{print $1"@"$2"$4"}' test.txt //在前三行中打印指定的段,并指定用@ 进行分割
    • 括号里面的分隔符,可以为 @ # 都可以使用
    • 括号里面的指定的分隔符,需要使用 "" 双引号标注出来
代码语言:javascript
复制
[root@hf-01 awk]# awk -F ':' '{print $1,$2,$4}' test.txt
root x 0
bin x 1
daemon x 2
adm x 4
lp x 7
sync x 0
shutdown x 0
等等等,只截取了一小部分

[root@hf-01 awk]# head -n3 test.txt |awk -F ':' '{print $1"@"$2"@"$4}'    //在前三行中,打印指定的段,并用 @ 分割
root@x@0
bin@x@1
daemon@x@2
[root@hf-01 awk]# 

awk命令 打印所有文件内容

  • 若使用awk命令,忽略了使用 -F (没有指定分割符),那么它默认将会以 空格 或 空白字符 为分割符去打印
  • awk '{print $0}' test.txt //打印出文件的所有内容——>相当于cat命令查看 [root@hf-01 awk]# awk '{print $0}' test.txt root:x:0:0:root:/root:/bin/bash 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 等等等,只截取了一小部分 [root@hf-01 awk]#

awk匹配功能(类似于grep命令的功能)

awk命令匹配打印包含字符的行

  • awk '/oo/' test.txt //打印匹配包含字符oo的行
代码语言:javascript
复制
[root@hf-01 awk]# awk '/oo/' test.txt    //打印匹配包含字符oo的行
root:x:0:0:root:/root:/bin/bash
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
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@hf-01 awk]# 

awk命令匹配打印某一段中包含字符的行

  • awk -F ':' '$1 ~ /oo/' test.txt //打印第一段中包含oo的行
代码语言:javascript
复制
[root@hf-01 awk]# awk -F ':' '$1 ~ /oo/' test.txt
root:x:0:0:root:/root:/bin/bash
[root@hf-01 awk]# 
  • awk -F ':' '$1 ~ /o+/' test.txt //匹配第一段中包含o字符的行
    • +号,表示一个或或多个+号前面的字符
代码语言:javascript
复制
[root@hf-01 awk]# awk -F ':' '$1 ~ /o+/' test.txt    //匹配第一段中包含o字符的行
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
operator:x:11:0:operator:/root:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
[root@hf-01 awk]# 

[root@hf-01 awk]# awk -F ':' '$1 ~ /oo+/' test.txt
root:x:0:0:root:/root:/bin/bash
[root@hf-01 awk]# 

这里会发现,有特殊符号的时候,grep命令需要加 -E 脱义,sed命令需要加 -r 脱义,而awk命令中的特殊符号则不需要脱义就可以实现操作

awk工具支持多个表达式一起写

  • awk -F ':' '/root/ {print $1,$3} /usr/ {print $3,$5}' test.txt //匹配包含root的行,打印第1段和第3段,然后在匹配包含usr的行并打印第3段和第4段
  • awk -F ':' '/root|usr/ {print $0}' test.txt //在文件所有段中,匹配包含root和usr的行
代码语言:javascript
复制
[root@hf-01 awk]# awk -F ':' '/root/ {print $1,$3} /usr/ {print $1,$3,$4}' test.txt    //匹配包含root的行,打印第1段和第3段,然后在匹配包含usr的行并打印第3段和第4段
root 0
operator 11
games 12 100
[root@hf-01 awk]# grep -E 'root|usr' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
[root@hf-01 awk]# 

[root@hf-01 awk]# awk -F ':' '/root|usr/ {print $0}' test.txt    //在文件所有段中,匹配包含root和usr的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
[root@hf-01 awk]# awk -F ':' '/root|usr/ {print $1,$3,$4}' test.txt
root 0 0
operator 11 0
games 12 100
[root@hf-01 awk]# 

awk工具支持多个表达式一起写

awk工具针对数学表达式

加单引号
  • awk -F ':' '$3==0' test.txt //匹配第3段等于0的,并打印所有段
    • 必须写 两个等于号,写一个等于号就相当于 赋值
  • awk -F ':' '$3==0 {print $1}' test.txt //匹配第3段等于0的,并打印第1段
  • awk -F ':' '$3>=1000' test.txt //匹配第3段大于等于1000的,并打印所有段
代码语言:javascript
复制
[root@hf-01 awk]# awk -F ':' '$3==0' test.txt    //匹配第3段等于0的,并打印所有段
root:x:0:0:root:/root:/bin/bash
[root@hf-01 awk]# awk -F ':' '$3==0 {print $1}' test.txt    //匹配第3段等于0的,并打印第1段
root
[root@hf-01 awk]# awk -F ':' '$3>=1000 {print $0}' test.txt    //匹配第3段大于等于1000的,并打印所有段
mysql:x:1000:1000::/home/mysql:/bin/bash
[root@hf-01 awk]# 
加双引号
  • awk -F ':' '$3>="500"' test.txt //第三段大于等于500的
    • 加上双引号后,会看到第三段的输出的内容,都是以ascii码的排序方式去计算的,它会认为这是一个字符串,而不是一个数字去计算——>若需求是针对数字的,一定不可以加 双引号 !!!
代码语言:javascript
复制
[root@hf-01 awk]# awk -F ':' '$3>="1000" {print $0}' test.txt
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
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
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
mysql:x:1000:1000::/home/mysql:/bin/bash
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
[root@hf-01 awk]# 
  • 若是字符串,则需要加上双引号
  • awk -F ':' '$7!="/sbin/nologin" {print $0}' test.txt //匹配打印出第7段不等于/sbin/nologin的所有段
代码语言:javascript
复制
[root@hf-01 awk]# awk -F ':' '$7!="/sbin/nologin" {print $0}' test.txt     //匹配打印出第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
mysql:x:1000:1000::/home/mysql:/bin/bash
[root@hf-01 awk]# 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • awk工具
    • awk功能前的准备工作
      • awk命令 指定分割符
        • awk命令 指定打印某一段
        • awk命令 指定打印多段内容,并指定以什么为分割
      • awk命令 打印所有文件内容
      • awk匹配功能(类似于grep命令的功能)
        • awk命令匹配打印包含字符的行
          • awk命令匹配打印某一段中包含字符的行
            • awk工具支持多个表达式一起写
              • awk工具针对数学表达式
                • 加单引号
                • 加双引号
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档