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

9.7 awk工具(下)

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

awk工具

  • awk -F ':' '$3<$4' /etc/passwd
  • awk -F ':' '$3>"5" && $3<"7"' /etc/passwd
  • awk -F ':' '$3>1000 || $7=="/bin/bash"' /etc/passwd
  • head -5 /etc/passwd |awk -F ':' '{OFS="#"} {print $1,$3,$4}‘
  • awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' /etc/passwd
  • head -n3 /etc/passwd | awk -F ':' '{print NF}‘
  • head -n3 /etc/passwd | awk -F ':' '{print NR}‘
  • awk 'NR>40' /etc/passwd
  • awk -F ':' 'NR<20 && $1 ~ /roo/' /etc/passwd
  • head -n 3 /etc/passwd |awk -F ':' '$1="root"‘
  • awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd
  • awk -F ':' '{if ($1=="root") {print $0}}' /etc/passwd

awk工具 两个字段相互比较

  • awk -F ':' '$3<$4' test.txt //比较第3段小于第4段的,并匹配打印出来
代码语言:javascript
复制
[root@localhost awk]# awk -F ':' '$3<$4' test.txt    //比较第3段小于第4段的,并匹配打印出来
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
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@localhost awk]# 

awk工具 两个字段相等

  • awk -F ':' '$3==$4' test.txt //匹配出第3段和第4段相等的行
代码语言:javascript
复制
[root@localhost awk]# awk -F ':' '$3==$4' test.txt     //匹配出第3段和第4段相等的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/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
[root@localhost awk]# 

awk工具 匹配大于5的字符,小于7的字符

  • awk -F ':' '$3>"5" && $3<"7"' test.txt //匹配第3段大于5的字符,和小于7的字符,并打印出来所在行
    • 这里双引号里面的数字表示 字符 ——>通过ASCII码进行比较
      • 数字比大写字母小,大写字母比小写字母小
      • 用双引号中字符的的第1个字符去和第3段进行比较
    • && 表示 和 的意思
代码语言:javascript
复制
[root@localhost awk]# awk -F ':' '$3>"5" && $3<"7"' test.txt    //匹配第3段大于5的字符,和小于7的字符,并打印出来所在行
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
tss:x:59:59:/var/spool/postfix:/sbin/nologin
[root@localhost awk]# 
代码语言:javascript
复制
这里的59是是在字符5和字符7之间的,所以就会匹配出来

awk工具 匹配大于94的段,或等于/sbin/nologin的段

  • awk -F ':' '$3>94 || $7=="/sbin/nologin"' test.txt //匹配第3段大于94的段,或者第7段等于/sbin/nologin的段所在的行都打印出来
    • || 表示 或者 的意思
代码语言:javascript
复制
[root@localhost awk]# vim test.txt
[root@localhost awk]# awk -F ':' '$3>94 || $7=="/sbin/nologin"' test.txt    //匹配第3段大于94的段,或者第7段等于/sbin/nologin的段所在的行都打印出来
yroot:x:95:95:root:/root
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
等等等,只截取了一部分
[root@localhost awk]# 

awk工具 匹配的段不精准匹配 ~

  • awk -F ':' '$3>94 || $7 ~ /bash/' test.txt //匹配第三段大于94的段,或者第7段包含/bin/的段,并都打印出来
    • == 就是严格匹配
    • ~ 这个只要包含就算匹配
    • 举例:
    • == 的话,第七段只能为/bin/bash才算符合
    • ~ 的话,第七段里只要有bash 就算符合,比如/sbin/bash, bin123 都算匹配
代码语言:javascript
复制
[root@localhost awk]# awk -F ':' '$3>94 || $7 ~ /bin/' test.txt    //匹配第三段大于94的段,或者第7段包含/bin/的段,并都打印出来
yroot:x:95:95:root:/root
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
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
等等等,只截取了一部分
[root@localhost awk]# 

awk工具 OFS

  • 若有多段的时候,分隔符可以用 # @ 替换,指定分隔符;还有另外一个功能,就是OFS,这是一个内置的变量,
    • -F 这是指定分段前的字符
    • OFS用来指定 print 时候用到的分隔符—>注意 语法!!
      • 先写OFS,在些print
  • awk -F ':' '{OFS="#"} $3>94 || $7 ~ /bin/ {print $1,$3,$7}' test.txt //匹配第3段大于94的段,或者第七段包含bin的段,然后打印第1,第3,第7段,用 #号 区分
    • 语法:在分割完之后,单引号里面用花括号括起来,给它指定print用到的分隔符OFS ,然后再写条件,最后在写print语句
代码语言:javascript
复制
[root@hf-01 awk]# head -n5 test.txt |awk -F ':' '{OFS="#"} $3>94 || $7 ~ /bin/ {print $1,$3,$7}'    //在前5行中,匹配第3段大于94的段,或者第七段包含bin的段,然后打印第1,第3,第7段,用 #号 区分
root#0#/bin/bash
bin#1#/sbin/nologin
daemon#2#/sbin/nologin
adm#3#/sbin/nologin
lp#4#/sbin/nologin
[root@hf-01 awk]# 
  • awk -F ':' '{OFS="@"} {if ($3>94) {print $1,$3,$7}}' test.txt //匹配第3段大于第九段的字符,然后打印第1,第3,第7段内容, 并用@分割
    • 匹配的分隔符,可以为@,可以为#
  • 上下表达式相同
    • 在使用if的时候,需要加一些符号,但是使用if 的表达式则更加规范
  • awk -F ':' '{OFS="@"} $3>94 {print $1,$3,$7}' test.txt
代码语言:javascript
复制
[root@hf-01 awk]# awk -F ':' '{OFS="@"} {if ($3>94) {print $1,$3,$7}}' test.txt    //匹配第3段大于第九段的字符,然后打印第1,第3,第7段内容, 并用@分割
nobody@99@/sbin/nologin
polkitd@999@/sbin/nologin
avahi-autoipd@170@/sbin/nologin
mysql@1000@/bin/bash
systemd-network@192@/sbin/nologin
[root@hf-01 awk]# 

[root@hf-01 awk]# awk -F ':' '{OFS="@"} $3>94 {print $1,$3,$7}' test.txt    //匹配第3段大于第九段的字符,然后打印第1,第3,第7段内容, 并用@分割
nobody@99@/sbin/nologin
polkitd@999@/sbin/nologin
avahi-autoipd@170@/sbin/nologin
mysql@1000@/bin/bash
systemd-network@192@/sbin/nologin
[root@hf-01 awk]# 

awk工具 两个内置的变量

  • OFS是打印print的时候,指定的变量符
  • NR 表示 行
  • NF 表示 段
  • head -n5 test.txt |awk -F ':' '{print NR":"$0}' test.txt //在前5行中,打印出所有的行
    • 这个就像grep的-n功能,显示所有行号
代码语言:javascript
复制
[root@hf-01 awk]# head -n5 test.txt| awk -F ':' '{print NR":"$0}'     //在前5行中,打印出所有的行
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
[root@hf-01 awk]# 
  • head -n5 test.txt |awk -F ':' '{print NF":"$0}' test.txt //在前5行中,打印所有的段
    • 在段的前面看到的数字,显示的是每一行有几段内容
代码语言:javascript
复制
[root@hf-01 awk]# head -n5 test.txt| awk -F ':' '{print NF":"$0}'    //在前5行中,打印所有的段
6:rootx: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
[root@hf-01 awk]# 
awk工具 NR 表示 行
  • sed -n '1,10'p test.txt //打印前十行
  • awk -F ':' 'NR<=10' test.txt //打印前十行
    • NR 表示 行,可作为一个判断条件
  • awk -F ':' 'NR<=10 && $1 ~ /root|sync' test.txt //匹配前10行中,第1段包含root或者sync的段,并把这一行打印出来
代码语言:javascript
复制
[root@hf-01 awk]# awk -F ':' 'NR<=10' test.txt    //打印前十行
rootx: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
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
[root@hf-01 awk]#

[root@hf-01 awk]# awk -F ':' 'NR<=10 && $1 ~ /root|sync/' test.txt    //匹配前10行中,第1段包含root或者sync的段,并把这一行打印出来
rootx:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
[root@hf-01 awk]# 
awk工具 NF 表示 段
  • awk -F ':' 'NF==6 && $1 ~ /root|sync/' test.txt //匹配文件中,是6段的行,并在第1段包含root或者sync的段,并把这一行打印出来
    • NF 表示 段
代码语言:javascript
复制
[root@hf-01 awk]# awk -F ':' 'NF==6 && $1 ~ /root|sync/' test.txt    //匹配文件中,是6段的行,并在第1段包含root或者sync的段,并把这一行打印出来
rootx:0:0:root:/root:/bin/bash
[root@hf-01 awk]# 

awk工具 $NR":"$NF

  • awk -F ':' '{print $NR":"$NF}' test.txt //就是文件的第几行一直匹配最后一段,一直持续到第七段结束(只有7段,所以后面为空) - $NR 表示多少行 - $NF 表示7段
    • 所以打印的内容为,第一行为
代码语言:javascript
复制
[root@hf-01 awk]# awk -F ':' '{print $NR":"$NF}' test.txt
rootx:/bin/bash        //文件第一行为 rootx 匹配最后一段 /bin/bash
x:/sbin/nologin        //文件第二行为 x 匹配最后一段 /sbin/nologin
2:/sbin/nologin        //......以此类推下去
4:/sbin/nologin
lp:/sbin/nologin
/sbin:/bin/sync
/sbin/shutdown:/sbin/shutdown    
:/sbin/halt                //因为$NR只有七行,所以在打印后面的时候,行为空
:/sbin/nologin
:/sbin/nologin
等等等,只截取了一部分
[root@hf-01 awk]#

awk工具 赋值

  • head -n3 test.txt |awk -F ':' '$1="root"' //在前3行中,第1段赋值为root
    • 一旦赋值之后,会看到分隔符消失了
    • 这时只需要定义下 OFS 即可
      • head -n3 test.txt |awk -F ':' '{OFS=":"} $1="root"' //在前3行中,第1段赋值为root,并定义分割符为:
代码语言:javascript
复制
[root@hf-01 awk]# head -n3 test.txt |awk -F ':' '$1="root"'     //在前3行中,第1段赋值为root
root 0 0 root /root /bin/bash
root x 1 1 bin /bin /sbin/nologin
root x 2 2 daemon /sbin /sbin/nologin
[root@hf-01 awk]# head -n3 test.txt |awk -F ':' '{OFS=":"} $1="root"'    //在前3行中,第1段赋值为root,并定义分割符为: 
root:0:0:root:/root:/bin/bash
root:x:1:1:bin:/bin:/sbin/nologin
root:x:2:2:daemon:/sbin:/sbin/nologin
[root@hf-01 awk]# 

awk工具 tot值求和

  • awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt //每次tot值循环,就会把第三段相加
    • tot 表示求和
      • 在第一次tot求和的时候,是为0与第3段相加,然后依次循环,一直到第3段结束,然后输出tot值
代码语言:javascript
复制
[root@hf-01 awk]# awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt
2847
[root@hf-01 awk]# 
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • awk工具
    • awk工具 两个字段相互比较
      • awk工具 两个字段相等
        • awk工具 匹配大于5的字符,小于7的字符
          • awk工具 匹配大于94的段,或等于/sbin/nologin的段
            • awk工具 匹配的段不精准匹配 ~
              • awk工具 OFS
                • awk工具 两个内置的变量
                  • awk工具 NR 表示 行
                  • awk工具 NF 表示 段
                • awk工具 $NR":"$NF
                  • awk工具 赋值
                    • awk工具 tot值求和
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档