Awk是一款功能强大的文本分析工具。简而言之,awk逐行读取文件。 (空格,制表符)是切割每一行的默认分隔符,然后分析切割的部分。
0,基本用法
Awk是一款功能强大的文本分析工具。简而言之,awk逐行读取文件。 (空格,制表符)是切割每一行的默认分隔符,并分析和处理剪切的部分。
awk命令格式如下
awk [-F field-separator]'命令'输入文件
[-F separator]是可选的,因为awk使用空格而tab是默认的字段分隔符,因此如果要浏览字段之间的空格,选项卡的文本,则不必指定此选项,但如果需要浏览/etc/passwd等文件,其中文件的字段用冒号分隔,必须指定-F选项。
Echo'这是一个测试'| awk'{print $ 0}'
##输出是
这是一个测试
shell读取用户输入的字符串found |,表示管道。左侧和右侧被理解为简单命令,即前一个(左侧)简单命令的标准输出指向下一个(右侧)标准命令的标准输入
Awk根据分隔符将行划分为字段,$ 0是整行,$ 1是第一个字段,$ 2是第二个字段,依此类推......
要打印字段或所有字段,请使用print命令。这是一个awk动作
Echo'这是一个测试'| awk'{print $ 1}'
##输出是
这个
Echo'这是一个测试'| awk'{print $ 1,$ 2}'
##输出是
这是
/etc/passwd文件的内容如下
Root: x: 0: 0: root:/root:/bin/bash
Bin: x: 1: 1: bin:/bin:/sbin/nologin
守护进程: x: 2: 2:守护进程:/sbin:/sbin/nologin
Adm: x: 3: 4: adm:/var/adm:/sbin/nologin
Lp: x: 4: 7: lp:/var/spool/lpd:/sbin/nologin
给出一些简单的小要求
1,仅显示/etc/passwd帐户Awk -F:'{print $ 1}'/etc/passwd
##输出是
根
箱子
守护进程
ADM
唱片
2,显示/etc/passwd的第一列和第七列,用逗号分隔,在所有行开始之前添加列名start1,start7,添加最后一行,end1,end7
Awk -F':''BEGIN {print'start1,start7'} {print $ 1','$ 7} END {print'end1,end7'}'/etc/passwd
##输出是
Start1,start7
Root,/bin/bash
Bin,/sbin/nologin
守护进程,/sbin/nologin
Adm,/sbin/nologin
Lp,/sbin/nologin
结束1,结束7
在执行所有文本处理操作之前执行BEGIN语句,并在执行所有文本处理操作之后执行END。
3,统计/etc/passwd文件,每行的行号,每行的列数,对应的完整行内容
Awk -F:'{print NR''NF''$ 0}'/etc/passwd
##输出是
1 7 root: x: 0: 0: root:/root:/bin/bash
2 7 bin: x: 1: 1: bin:/bin:/sbin/nologin
3 7守护进程: x: 2: 2:守护进程:/sbin:/sbin/nologin
4 7 adm: x: 3: 4: adm:/var/adm:/sbin/nologin
5 7 lp: x: 4: 7: lp:/var/spool/lpd:/sbin/nologin
1,支持内置变量
在上面的例子中,NR和NF实际上是awk内置变量,一些内置变量如下
变量名解释
FILENAMEawk浏览的文件名
FS设置输入字段分隔符,相当于命令行-F选项
NF浏览记录中的字段数
NR已读取的记录数
2,支持功能
输出字符串长度
awk'BEGIN {打印长度('这是一个文字')}'##输出是
14
将/etc/passwd的用户名更改为大写输出
Awk -F':''{print toupper($ 1)}'/etc/passwd
##输出是
根
BIN
DAEMON
ADM
唱片
常用功能如下
功能名称
Toupper(s)返回s的大写字母
Tolower(s)返回s的小写字母
长度返回s的长度
Substr(s,p)从p开始返回字符串s的后缀部分
3,支持条件运算,正则表达式匹配
在/etc/passwd中显示守护进程行
Awk -F':''$ 0~/daemon /'/etc/passwd
##输出是
守护进程: x: 2: 2:守护进程:/sbin:/sbin/nologin
awk条件运算符
运营商说明
出2>
&1&
关闭脚本如下,kill.sh
杀掉-9`jps -l | grep'weibo-interface-1.0.jar'| awk'{print $ 1}'`
jps -l的输出如下
70208 com.st.kmp.main.KmpService
31036 com.st.cis.main.BaiduAnalysisService
66813 weibo-interface-1.0.jar
还有关闭Hadoop集群的所有DataNode节点(我不知道Hadoop可以将DataNode视为集群应用程序),如果一台机器jps,查看pid,kill。非常麻烦,直接编写脚本,依次ssh到每个节点,然后执行以下命令杀掉jps | grep'DataNode'| awk'{print $ 1}'`
jps的输出是
508 DataNode
31481 JournalNode
31973 NodeManager