一、awk工具的使用
awk和sed一样是流式编辑器,它也是针对文档中的行来操作的。它比sed更强大,相对sed它支持分段,

1、截取文件中的某个段

awk -F ':' '{print $1}' test.txt 打印第一段;
awk -F ':' '{print $0}' test.txt 打印所有段;
不指定分隔符:(无论指定哪一行都会打印抽有段)
awk '{print $1}' test.txt
awk '{print $0}' test.txt
-F 指定分隔符,如果不加-F指定,则以空格或者tab为分隔符
$1 第1字段,$2第2字段,$0表示整行

print 打印,print的动作要用 { } 括起来,它还可以打印自定义的内容。但自定义的内容要用双引号引起来。如果你在{}外加双引号,无语指定哪一段,它都会把内容全部打印出来。例:

head -2 /etc/passwd |awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
[root@riven ~]# head -2 /etc/passwd |awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
root#x#0#0
bin#x#1#1
[root@riven ~]# 

2、匹配字符或字符串(跟sed用法差不多)

awk '/oo/' test.txt 匹配有oo的行
awk -F ':' '$1 ~ /oo/' test.txt 第一段包括oo的行。
awk -F ':' '$1~ /o+/' test.txt 匹配所有包括o的行

[root@riven ~]# awk -F ':' '$1~ /oo/' test.txt
root:x:0:0:root:/root:/bin/bash
[root@riven ~]# awk -F ':' '$1~ /o+/' test.txt
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
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
[root@riven ~]# awk -F ':' '$1~ /oo+/' test.txt
root:x:0:0:root:/root:/bin/bash
[root@riven ~]# 

同时支持多个表达式同时写,多次匹配,匹配完root,再匹配test,它还可以只打印所匹配的段
awk -F ':' '/test/ {print $1,$3} /root/ {print $1,$3} /user/ {print $1,$3,$4}' test.txt
检查这些段是不是有包括root 跟test,user
grep -nE 'test|root|user' test.txt
awk -F ':' '/test|root|user/ {print $0}' test.txt

[root@riven ~]# awk -F ':' '/test/ {print $1,$3} /root/ {print $1,$3} /user/ {print $1,$3,$4}' test.txt
root 0
operator 11
test 1003
user2 1004 1004
saslauth 997 76
[root@riven ~]# grep -nE 'test|root|test' test.txt
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
24:test:x:1003:1001::/home/test:/bin/bash
[root@riven ~]# grep -nE 'test|root|user' test.txt
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
24:test:x:1003:1001::/home/test:/bin/bash
25:user2:x:1004:1004::/home/user2:/bin/bash
28:saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
[root@riven ~]# awk -F ':' '/test|root|user/ {print $0}' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
test:x:1003:1001::/home/test:/bin/bash
user2:x:1004:1004::/home/user2:/bin/bash
saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
[root@riven ~]# 

3、条件操作符

awk中是可以用逻辑符号判断的,比如 ‘==’ 就是等于,也可以理解为 ‘精确匹配’ 另外也有 >, ‘>=, ‘<, ‘<=, ‘!= 等等,
awk -F ':' '$3==0' test.txt
awk -F ':' '$3==0' {print $3}' test.txt

[root@riven ~]# awk -F ':' '$3==0' test.txt
root:x:0:0:root:/root:/bin/bash
[root@riven ~]# awk -F ':' '$3==0 {print $3}' test.txt
0
[root@riven ~]# 

在和数字比较时,若把比较的数字用双引号引起来后,那么awk会认为是字符,不加双引号则认为是数字。
例:
awk -F ':' '$3 >=500 {print $3}' test.txt 打印UID大于或等于500的行
awk -F ':' '$3 >="500" {print $3}' test.txt

[root@riven ~]# awk -F ':' '$3 >=500 {print $3}' test.txt
999
998
1000
1003
1004
1005
997
[root@riven ~]# awk -F ':' '$3 >="500" {print $3}' test.txt
6
7
8
99
81
999
89
998
74
72
997
[root@riven ~]# 
[root@riven ~]# awk -F ':' '$3 >=500' test.txt
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
riven:x:1000:1000::/home/riven:/bin/bash
test:x:1003:1001::/home/test:/bin/bash
user2:x:1004:1004::/home/user2:/bin/bash
httpd:x:1005:1012::/home/httpd:/bin/nologin
saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
[root@riven ~]# 

!= 不等于,不匹配,字符串要加上双引号“”

例:awk -F ':' '$7!="/sbin/nologin"' test.txt 不匹配/sbin/nologin ,

[root@riven ~]# awk -F ':' '$7!="/sbin/nologin"' test.txt
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
riven:x:1000:1000::/home/riven:/bin/bash
test:x:1003:1001::/home/test:/bin/bash
user2:x:1004:1004::/home/user2:/bin/bash
httpd:x:1005:1012::/home/httpd:/bin/nologin
[root@riven ~]# 

除了针对某一个段的字符进行逻辑比较外,还可以两个段之间进行逻辑比较。
例:awk -F ':' '$3<$4' test.txt 第三个字符小于第四个字符的项。

[root@riven ~]# awk -F ':' '$3>$4' test.txt
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
test:x:1003:1001::/home/test:/bin/bash
saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin

&& 和 || 表示 “并且” 和 “或者” 的意思。
awk -F ':' '$3>"5" && $3<"7"' test.txt 5跟7为字符串,要用双引号引起来
awk -F ':' '$3>1000 || $7="/sbin/nologin"' test.txt

 [root@riven ~]#  awk -F ':' '$3>"5" && $3<"7"' test.txt
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
[root@riven ~]# awk -F ':' '$3>1000 || $7="/sbin/nologin"' test.txt
root x 0 0 root /root /sbin/nologin
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 /sbin/nologin
shutdown x 6 0 shutdown /sbin /sbin/nologin
halt x 7 0 halt /sbin /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 997 User for polkitd / /sbin/nologin
postfix x 89 89  /var/spool/postfix /sbin/nologin
chrony x 998 996  /var/lib/chrony /sbin/nologin
sshd x 74 74 Privilege-separated SSH /var/empty/sshd /sbin/nologin
ntp x 38 38  /etc/ntp /sbin/nologin
tcpdump x 72 72  / /sbin/nologin
nscd x 28 28 NSCD Daemon / /sbin/nologin
riven x 1000 1000  /home/riven /sbin/nologin
test:x:1003:1001::/home/test:/bin/bash
user2:x:1004:1004::/home/user2:/bin/bash
httpd:x:1005:1012::/home/httpd:/bin/nologin
apache x 48 48 Apache /usr/share/httpd /sbin/nologin
saslauth x 997 76 Saslauthd user /run/saslauthd /sbin/nologin
[root@riven ~]#

4、awk的内置变量

awk常用的变量有:
OFS 如果有多段,用来指定print 用到的分隔符,
awk -F ':' '{OFS="#" } $3>1000 || $7="/sbin/nologin" {print $1,$3,$5,$7}' test.txt

[root@riven ~]# awk -F ':' '{OFS="#" } $3>1000 || $7="/sbin/nologin" {print $1,$3,$5,$7}' test.txt
root#0#root#/sbin/nologin
bin#1#bin#/sbin/nologin
daemon#2#daemon#/sbin/nologin
adm#3#adm#/sbin/nologin
lp#4#lp#/sbin/nologin
sync#5#sync#/sbin/nologin
shutdown#6#shutdown#/sbin/nologin
halt#7#halt#/sbin/nologin
mail#8#mail#/sbin/nologin
operator#11#operator#/sbin/nologin
games#12#games#/sbin/nologin
ftp#14#FTP User#/sbin/nologin
nobody#99#Nobody#/sbin/nologin
systemd-network#192#systemd Network Management#/sbin/nologin
dbus#81#System message bus#/sbin/nologin
polkitd#999#User for polkitd#/sbin/nologin
postfix#89##/sbin/nologin
chrony#998##/sbin/nologin
sshd#74#Privilege-separated SSH#/sbin/nologin
ntp#38##/sbin/nologin
tcpdump#72##/sbin/nologin
nscd#28#NSCD Daemon#/sbin/nologin
riven#1000##/sbin/nologin
test#1003##/bin/bash
user2#1004##/bin/bash
httpd#1005##/bin/nologin
apache#48#Apache#/sbin/nologin
saslauth#997#Saslauthd user#/sbin/nologin
[root@riven ~]# 

awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' test.txt

[root@riven ~]# awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' test.txt
test#x#1003#1001
user2#x#1004#1004
httpd#x#1005#1012
[root@riven ~]# 

NR :行数
awk -F ':' '{print NR":"$0}' test.txt 打印所有的行号

[root@riven ~]# awk -F ':' '{print NR":"$0}' test.txt
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
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
11:games:x:12:100:games:/usr/games:/sbin/nologin
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13:nobody:x:99:99:Nobody:/:/sbin/nologin
14:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15:dbus:x:81:81:System message bus:/:/sbin/nologin
16:polkitd:x:999:997:User for polkitd:/:/sbin/nologin
17:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
18:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
19:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
20:ntp:x:38:38::/etc/ntp:/sbin/nologin
21:tcpdump:x:72:72::/:/sbin/nologin
22:nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
23:riven:x:1000:1000::/home/riven:/bin/bash
24:test:x:1003:1001::/home/test:/bin/bash
25:user2:x:1004:1004::/home/user2:/bin/bash
26:httpd:x:1005:1012::/home/httpd:/bin/nologin
27:apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
28:saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
[root@riven ~]# 

打印前10行: awk -F ':' 'NR<=10' test.txt
打印前面10行且包括root和sync的 awk -F ':' 'NR<=10 && /root|sync/' test.txt
NF :用分隔符分隔后一共有多少段`
awk -F ':' '{print NF":"$0}' test.txt

[root@riven ~]# awk -F ':' '{print NF":"$0}' test.txt
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
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
7:halt:x:7:0:halt:/sbin:/sbin/halt
7:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
7:operator:x:11:0:operator:/root:/sbin/nologin
7:games:x:12:100:games:/usr/games:/sbin/nologin
7:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
7:nobody:x:99:99:Nobody:/:/sbin/nologin
7:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
7:dbus:x:81:81:System message bus:/:/sbin/nologin
7:polkitd:x:999:997:User for polkitd:/:/sbin/nologin
7:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
7:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
7:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
7:ntp:x:38:38::/etc/ntp:/sbin/nologin
7:tcpdump:x:72:72::/:/sbin/nologin
7:nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
7:riven:x:1000:1000::/home/riven:/bin/bash
7:test:x:1003:1001::/home/test:/bin/bash
7:user2:x:1004:1004::/home/user2:/bin/bash
7:httpd:x:1005:1012::/home/httpd:/bin/nologin
7:apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
7:saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
[root@riven ~]# 

NF 是多少段,而$NF是最后一段的值, 而NR则是行号。$NR对应的是:行号是几显示的就是第几个段的字符。

awk -F ':' '{print $NR":"$NF}' test.txt

5、awk中的数学运算

awk可以把段值更改:
例: head -n 3 /etc/passwd |awk -F ':' '$1="root"' 前三行的第一段赋值成root
但进行赋值之后没有了: 那我们就需要定义OFS
head -3 /etc/passwd |awk -F ':' '{OFS=":"} $1="root"'


[root@riven ~]# head -3 /etc/passwd |awk -F ':' '{OFS=":"} $1="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
[root@riven ~]# head -3 /etc/passwd |awk -F ':' ' $1="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
[root@riven ~]#

对各个段的值进行数学运算:

计算某个段的总和:tot求和。
awk -F ':' '{(tot=tot+$3)};END {print tot}' test.txt 给文件所有行的第三段求和

[root@riven ~]# awk -F ':' '{(tot=tot+$3)};END {print tot}' test.txt
7800
[root@riven ~]#

在awk中使用if判断、for循环:

[root@riven ~]# awk -F ':' '{if ($1=="root") print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@riven ~]# 

转载于:https://blog.51cto.com/10690709/2108731

第二十七课 awk工具相关推荐

  1. 【中国寒龙出品】VB程序设计视频教程讲座第二十七课,欢迎各位订阅感谢朋友们的支持...

    [中国寒龙出品]VB程序设计视频教程讲座第二十七课,欢迎各位订阅感谢朋友们的支持 转载于:https://www.cnblogs.com/hackerschina/articles/4790717.h ...

  2. 【问链财经-区块链基础知识系列】 第二十七课 区块链与分布式账本的异同

    编者按:在加密货币和区块链领域,有一个业内人士常挂在嘴边的新术语:分布式账本技术(简称DLT).但具有讽刺意味的是,恰恰是比特币和各种区块链试图颠覆的实体们,例如银行,政府和大公司,对分布式账本技术情 ...

  3. 新版标准日本语初级_第二十七课

    语法   1. 小句简体形 + 時:表示时间的名词短语.小句为动词小句时分两种情况: ~する(基本形) + 時表示最近发生的事. ~した(た形) + 時表示以前发生的事.   小句为一类形容词小句时, ...

  4. 第二十七课:Power Network Synthesis(PNS)

    总览 前面完成了IO pad 及macro cell的placement及congestion的消除,本节课开始说明PG network的放置并满足congestion与timing delay: 整 ...

  5. 第二十七课.深度强化学习(二)

    目录 概述 价值学习 Deep Q Network DQN的训练:TD算法(Temporal Difference Learning) 策略学习 Policy Network 策略网络训练:Polic ...

  6. HLS第二十七课(UG871,tcl与工程模式,typedefine, Csim)

    打开vivado HLS command prompt, 首先是,切换盘符,直接键入 ---->E: 切换到E盘, 然后,运行cd命令, 到需要打开工程的目录下, ---->cd E:\s ...

  7. 实践数据湖iceberg 第三十七课 kakfa写入iceberg的 icberg表的 enfource ,not enfource测试

    系列文章目录 实践数据湖iceberg 第一课 入门 实践数据湖iceberg 第二课 iceberg基于hadoop的底层数据格式 实践数据湖iceberg 第三课 在sqlclient中,以sql ...

  8. Asp.Net Web API 2第十七课——Creating an OData Endpoint in ASP.NET Web API 2(OData终结点)...

    原文:Asp.Net Web API 2第十七课--Creating an OData Endpoint in ASP.NET Web API 2(OData终结点) 前言 很久没更新博客了,加上刚过 ...

  9. NeHe OpenGL教程 第四十七课:CG顶点脚本

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  10. [你必须知道的.NET]第二十七回:interface到底继承于object吗?

    <你必须知道的.NET>网站 | Anytao技术博客  [你必须知道的.NET]第二十七回:interface到底继承于object吗? 发布日期:2009.03.05 作者:Anyta ...

最新文章

  1. Objective-C学习笔记(十九)——对象方法和类方法的相互调用
  2. 【错误记录】生成 Java 文档错误 ( Xxx.java:xx: 错误: 编码GBK的不可映射字符 )
  3. 2_指令集、体系架构、微架构
  4. JVM - 应用JVM核心参数推荐设置
  5. [Domino]Java访问Domino必需配置的服务器设置
  6. UVA4671 K-neighbor substrings FFT+字符串hash
  7. 第四周 Access总结
  8. Python处理各种压缩文件(bzip2,gzip,zip)
  9. python从入门到放弃pdf下载-Python从入门到放弃(一): Python下载及打开世界之窗...
  10. L298电机驱动设计(含原理图)
  11. 当前安装包签名出现异常_安卓系统手机安装应用出现应用签名异常或-22错误(联网验证失败)的应对方法...
  12. 【裴礼文数学分析】例1.1.1
  13. 赵玉海:科技部已组织专家编制中国云
  14. 【路径规划】遗传算法求解考虑分配次序的多无人机协同目标分配问题
  15. jsp异常 The JSP specification requires that an attribute name is preceded by whitespace
  16. 电脑任务栏卡死的解决方法
  17. 用c语言实现矩阵的转置算法,C++实现矩阵原地转置算法
  18. CSS世界-第四章 盒尺寸四大家族
  19. Docker探赜索隐
  20. htons(), htonl(), ntohs(), ntohl()

热门文章

  1. iOS程序破解:获取应用商店上应用的ipa程序包
  2. 高德地图——步行导航
  3. 南邮《网络技术与应用,携程开源的分布式apollo技术
  4. 即时与及时有什么区别_即时与及时有什么区别?
  5. 用数学语言说我爱你怎么说_你会说我的语言吗
  6. LZJ的Python第二次打卡
  7. 助力数字经济,服务数智化转型,用友火力全开
  8. 为知笔记 | 3 分钟创建格式美美的笔记
  9. ajax 传递请求参数
  10. 面试官问你如何进行程序设计?——设计模式之七大原则——单一职责、里氏代换、开闭原则、依赖倒转以及C++简单实现