awk工具
在Linux系统中,awk是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于Shell脚本,完成各种自动化配置任务。
<人力资源/> <人力资源/>awk常见用法
一般来说awk所使用的命令格式如下所示,其中,单引号加上大括号“{}”用于设置对数据进行的处理动作.awk可以直接处理目标文件,也可以通过“- f”读取脚本对目标文件进行处理。
<代码> awk选项的模式或条件{编辑指令}的文件1文件2 ?//过滤并输出文件符条件的内容 awk - f脚本文件文件1文件2 ?//从脚本中调用编辑指令,过滤并输出内容代码>
awk相对倾向于将一行分成多个”字段“然后再进行处理,且默认情况下字段的分隔符为空格或者tab键.awk执行结果可以通过打印的功能将字段数据打印显示。在使用awk命令的过程中,可以使用逻辑操作符“,和”,表示“与”、“| |”表示“或”、“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/?,^分别表示加,减,乘,除,取余和乘方。
<人力资源/>在Linux系统中/etc/passwd是一个非常典型的格式化文件,各字段间使用“:”作为分隔符隔开,Linux系统中的大部分日志文件也是格式化文件,从这些文件中提取相关信息是运维的日常工作内容之一。若需要查找出/etc/passwd的用户名,用户ID,组ID等列,执行以下awk命令即可。
<代码> [root@192 ~] # awk - f‘:’’{打印$ 1、$ 3 $ 5}"/etc/passwd 根0根 本1本 守护进程2守护进程 adm 3 adm lp 4 lp 同步5同步 关闭关闭6 代码><人力资源/> <人力资源/>
awk工作原理图
awk从输入文件或者标准输入中读入信息,与sed一样,信息的读入也是逐行读取的。不同的是awk将文本文件中的一行视为一个记录,而将一行中的某一部分(列)作为记录中的一个字段(域)。为了操作这些不同的字段,awk借用壳中类似于位置变量的方法,用$ 1,$ 2,3美元?顺序地表示行(记录)中的不同字段。另外awk用$ 0表示整个行(记录)。不同的字段之间是通过指定的字符分隔.awk默认的分隔符是空格.awk允许在命令行中用“- f分隔符”的形式来指定分隔符。
awk内建变量(可直接用)
<代码> FS:指定每行文本的字段分隔符,默认为空格或制表位 尼克-弗瑞:当前处理的行的字段个数 NR:当前处理的行的行号(序数) 0:当前处理的行的整行内容 $ n:当前处理行的第n个字段(第n列) 文件名:被处理的文件名 拉尔夫-舒马赫:数据记录分隔,默认为\ n,即每行为一条记录代码><人力资源/> <人力资源/>
awk用法
<强> 1。按行输出文本强>
<代码> awk{打印}的尝试。txt//输出所有内容,等同于猫用法 awk的{打印$ 0}’试试。txt//输出所有内容,等同于猫用法 awk的NR==1, NR==3{打印}’试试。txt//输出第1 ~ 3行内容 awk的(NR>=1),和(NR<=3){打印}’试试。txt//输出第1 ~ 3行内容 awk的NR==1 | | NR==3{打印}’试试。txt//输出第1行,第3行内容 awk的(NR % 2)==1{打印}’试试。txt//输出所有奇数行的内容 awk的(NR % 2)==0{打印}’试试。txt//输出所有偶数行的内容 awk/etc/passwd根/{打印}' '/^//输出以根开头的行 awk/nologin $/{打印}的/etc/passwd//输出以nologin结尾的行 awk的开始{x=0};/\/bin \/bash美元/{x + +}, {x}打印结束的/etc/passwd//统计以/bin/bash结尾的行数,等同于grep - c/bin/bash美元/etc/passwd awk的开始{RS=" "};结束{打印NR}’/etc/squid/squid.conf//统计以空行分隔的文本段落数代码><人力资源/>
<>强范例演示强>
<代码> [root@192选择]# awk”(NR % 2)==1{打印}’试试。txt//输出奇数行内容 1 3. 5 7 9 [root@192选择]# awk”(NR % 2)==0{打印}’试试。txt//输出偶数行内容 2 4 6 8 0 代码><人力资源/>
<强> 2。按字段输出文本强>
<代码> awk{打印3美元}的测试。txt//输出每行中(以空格或制表位分隔)的第3个字段 awk{打印$ 1、$ 3}的测试。txt//输出每行中的第1,3个字段 awk - f”:“2美元=="{打印}’/etc/shadow//输出密码为空的用户的影子记录 awk的开始{FS=": "};2美元=="{打印}’/etc/shadow//输出密码为空的用户的影子记录 awk - f”:“7美元~”/bash”{打印$ 1}’/etc/passwd//输出以冒号分隔且第7个字段中包含/bash的行的第1个字段 awk(1美元~”nfs”),和(NF==8){打印$ 1、$ 2}的/etc/services//输出包含8个字段且第1个字段中包含nfs的行的第1,2个字段 awk - f”:“(7美元!=/bin/bash),和(7美元!="/sbin/nologin”){打印}"/etc/passwd//输出第7个字段既不为/bin/bash也不为/sbin/nologin的所有行shell脚本之正则表达式(三)——awk工具