工作模式,类似cut功能,
<a href="https://s4.51cto.com/wyfs02/M02/A5/33/wKioL1m5K27gmyzzAABRuEsxdiY222.png" target="_blank"></a>
<a href="https://s3.51cto.com/wyfs02/M01/06/86/wKiom1m50UvhVkgDAAB7BsGSWQo319.png" target="_blank"></a>
<a href="https://s2.51cto.com/wyfs02/M00/A5/36/wKioL1m50SHBznafAAB8tnsJFeM192.png" target="_blank"></a>
<a href="https://s2.51cto.com/wyfs02/M02/06/86/wKiom1m50UvAQJN2AAB9rdvQkL8379.png" target="_blank"></a>
与sed区别
1、格式
<a href="https://s4.51cto.com/wyfs02/M02/A5/37/wKioL1m51LTymMxPAAAQEejcduo502.png" target="_blank"></a>
2、PATTERN
<a href="https://s2.51cto.com/wyfs02/M02/06/87/wKiom1m51SOTw6w2AAATrBlT8ag608.png" target="_blank"></a>
<a href="https://s1.51cto.com/wyfs02/M02/06/87/wKiom1m51iPyiZUjAAAYlb4tXSI235.png" target="_blank"></a>
<a href="https://s5.51cto.com/wyfs02/M01/06/87/wKiom1m51r7A8XvAAAAPx4yS46A797.png" target="_blank"></a>
<a href="https://s5.51cto.com/wyfs02/M01/06/87/wKiom1m52B_Cdr__AABDbgqs-rI881.png" target="_blank"></a>
<a href="https://s1.51cto.com/wyfs02/M00/06/87/wKiom1m52uLhQQPnAAAzN8t2rFk895.png" target="_blank"></a>
<a href="https://s2.51cto.com/wyfs02/M02/06/87/wKiom1m5242BChhAAAA16sjwe_A895.png" target="_blank"></a>
awk基本格式:
awk [OPTION...] 'PATTERN{ACTION STATEMENT;ACTION STATEMENT;...}' FILE1 FILE2 ...
OPTION:
-F '' 指明分隔符
-v var="value" 定义变量
PATTERN:定义读入哪些行时对行处理
ACTION: 对行如何处理,文本格式化输出:print,printf
1
<code>多个语句间用 ;</code>
1、变量
内建变量
<a href="https://s3.51cto.com/wyfs02/M00/06/84/wKiom1m5O_LCj4q1AAAX-yAsoIU007.png" target="_blank"></a>
<a href="https://s3.51cto.com/wyfs02/M00/A5/34/wKioL1m5O8mTyKdaAAAWRyeU204607.png" target="_blank"></a>
<a href="https://s3.51cto.com/wyfs02/M02/06/84/wKiom1m5O_PwzrcaAAAOhx8-uMs464.png" target="_blank"></a>
<a href="https://s3.51cto.com/wyfs02/M01/06/84/wKiom1m5O_PTvN-gAAAO9vry7Gk113.png" target="_blank"></a>
<a href="https://s3.51cto.com/wyfs02/M01/A5/34/wKioL1m5O8nDEmwgAAAWQdQmS_U497.png" target="_blank"></a>
<a href="https://s5.51cto.com/wyfs02/M01/A5/34/wKioL1m5O8qQyg32AAAXxtOtxtQ289.png" target="_blank"></a>
<a href="https://s5.51cto.com/wyfs02/M02/06/84/wKiom1m5O_OhdYXwAAAWdxdqr_0902.png" target="_blank"></a>
<a href="https://s5.51cto.com/wyfs02/M00/06/84/wKiom1m5O_TxoDqmAAAQjQbI-qs626.png" target="_blank"></a>
<a href="https://s4.51cto.com/wyfs02/M02/A5/34/wKioL1m5O_7AlT5xAAATSBHePBQ500.png" target="_blank"></a>
<a href="https://s5.51cto.com/wyfs02/M02/A5/34/wKioL1m5O__B2-E9AAAXnHVzJoQ203.png" target="_blank"></a>
自定义变量
<a href="https://s5.51cto.com/wyfs02/M00/A5/34/wKioL1m5PD7geF5ZAAAX_Rlrcnc416.png" target="_blank"></a>
变量应用注意
<a href="https://s5.51cto.com/wyfs02/M01/06/87/wKiom1m52ZaR-C3iAAATPuJkA20312.png" target="_blank"></a>
2、ACTION
<a href="https://s1.51cto.com/wyfs02/M01/A5/34/wKioL1m5PM3AQ32ZAAA7V3jg3S8671.png" target="_blank"></a>
printf
3、操作符
<a href="https://s1.51cto.com/wyfs02/M01/A5/34/wKioL1m5Pp_Q3M6cAAAmQmDnIbY928.png" target="_blank"></a>
<a href="https://s5.51cto.com/wyfs02/M01/06/84/wKiom1m5PrnxjqQyAAAvONOQYGw505.png" target="_blank"></a>
<a href="https://s1.51cto.com/wyfs02/M02/06/84/wKiom1m5P4PSxWsGAABdT9H_mCY541.png" target="_blank"></a>
4、PATTERN定界:'PATTERN{ACTION STATEMENT}'
<a href="https://s1.51cto.com/wyfs02/M00/A5/38/wKioL1m54HKBpFclAAAZDLCqtrI578.png" target="_blank"></a>
<a href="https://s1.51cto.com/wyfs02/M01/06/88/wKiom1m54Jyyy5jqAAAbtV5Epbs962.png" target="_blank"></a>
<a href="https://s1.51cto.com/wyfs02/M01/A5/38/wKioL1m54HLAmLRfAAARe_s4Itw444.png" target="_blank"></a>
<a href="https://s2.51cto.com/wyfs02/M02/06/88/wKiom1m54J2C179XAAA0YTk3tNI513.png" target="_blank"></a>
<a href="https://s2.51cto.com/wyfs02/M01/A5/38/wKioL1m54HOR1paGAAAbknCbA80348.png" target="_blank"></a>
<a href="https://s2.51cto.com/wyfs02/M00/06/88/wKiom1m54J2xd8TQAAAa9OCgxfI017.png" target="_blank"></a>
<a href="https://s2.51cto.com/wyfs02/M02/A5/38/wKioL1m54HSArFKOAABjUFrS39U185.png" target="_blank"></a>
5、ACTION
<a href="https://s3.51cto.com/wyfs02/M00/A5/39/wKioL1m54RqDlOrfAABE6HVfSJM312.png" target="_blank"></a>
5.1 if-else awk取得的行进行字段判断
2
<code>if</code> <code>(condition) {</code><code>true</code><code>-statement} 或 </code><code>if</code> <code>(condition) </code><code>true</code><code>-statement</code>
<code>if</code> <code>(condition) {</code><code>true</code><code>-statement} </code><code>else</code> <code>{</code><code>false</code><code>-statement}</code>
id号大于1000为普通用户
最后一个字段的行/bin/bash结尾
字段数大于5个,显示行,否则不显示
显示文件系统使用结果>80则显示
3
<code>id</code><code>号大于1000为普通用户</code>
<code># awk -F ':' '{if ($3>500){print $1,$3}}' /etc/passwd</code>
<code># awk -F ':' '{if ($3>500){printf "%15s %-d\n",$1,$3}}' /etc/passwd</code>
<code>最后一个字段的行/bin/bash结尾</code>
<code># awk -F </code><code>':'</code> <code>'{if ($NF == "/bin/bash"){print $1,$3}}'</code> <code>/etc/passwd</code>
<code># awk -F </code><code>':'</code> <code>'{if ($NF ~ /\<bash$/){print $NF}}'</code> <code>/etc/passwd</code>
<code>字段数大于</code><code>5</code><code>个,显示行,否则不显示</code>
<code># awk -F </code><code>':'</code> <code>'{if (NF>5){print $0}}'</code> <code>/etc/passwd</code>
<code>显示文件系统使用结果></code><code>80</code><code>则显示</code>
<code># df -hP | awk -v FS=</code><code>"%"</code> <code>'!/^File/{print $1}'</code> <code>| awk </code><code>'{if ($NF>80){print $1}}'</code>
5.2 while 对一行内的多个字段逐一处理时使用,对数组中各元素逐一处理时使用
4
5
<code>while</code> <code>(condition) {</code><code>true</code><code>-statement}</code>
<code>(condition) 判断条件</code>
<code> </code><code>{</code><code>true</code><code>-statement} 条件为真时,执行循环体</code>
<code>length(arg1,arg2,...) 显示字段的长度</code>
对整个一行中的各字段,显示各字段内容和字段中包含的字段的个数
对整个一行中的各字段,字段大于等于10才显示字段内容和字段中包含的字段的个数
<code># awk </code><code>'{i=1;while (i<=NF){print $i,length($i);i++}}'</code> <code>/etc/fstab</code>
<code>思路: awk </code><code>'{print length($i)}'</code> <code>FILE</code>
<code>i表示每个字段即可</code>
<code># awk </code><code>'{i=1;while (i<=NF){if (length($i)>5)print $i,length($i);i++}}'</code> <code>/etc/fstab </code>
<code>循环嵌套</code><code>if</code><code>条件判断</code>
5.3 do-while循环
<code>do</code> <code>{</code><code>true</code><code>-statement} </code><code>while</code> <code>(condition)</code>
<code>至少执行一次循环体</code>
<code># awk </code><code>'{i=1;do {print $i,length($i);i++} while (i<=NF)}'</code> <code>/etc/issue</code>
5.4 for 循环
<code>for</code> <code>(控制变量初始化;控制变量条件表达式;控制变量的修正表达式) {statement}</code>
<code>for</code> <code>(</code><code>var</code><code>iable assignment;condition;iteration process) {</code><code>for</code><code>-body}</code>
6
7
8
<code>显示模式匹配到的行</code>
<code># awk </code><code>'/^[[:space:]]+/{print}'</code> <code>/etc/grub.conf</code>
<code>用I表示每个字段</code>
<code># awk </code><code>'/^[[:space:]]+/{print length($i)}'</code> <code>/etc/grub.conf </code>
<code>套入循环格式 ,在循环体中要对I值进行修正</code>
<code># awk </code><code>'/^[[:space:]]+/{i=1;while (i<=NF){print $i,length($i);i++}}'</code> <code>/etc/grub.conf</code>
<code>循环体中嵌套单分支</code><code>if</code><code>语句 ,单分支</code><code>if</code><code>的statement的{} 可省略</code>
<code># awk </code><code>'/^[[:space:]]+/{i=1;while (i<=NF){if (length($i)>=10)print $i,length($i);i++}}'</code> <code>/etc/grub.conf</code>
5.5 switch语句 多分支if
<code>switch</code> <code>(expression) (</code><code>case</code> <code>VALUE1 or /REGEXP1/:statement;</code><code>case</code> <code>VALUE2 or /REGEXP2/:statement;...; </code><code>default</code><code>:statemet)</code>
<code>表达式 == value1 或 表达式 ~ /REGEXP1</code>
》》》
5.6 break [n] 或 continue
<code>显示奇数字段</code>
<code># awk -F </code><code>':'</code> <code>'{i=1;while (i<=NF){if (i%2==0) {i++;continue} else {print i,$i;i++}}}'</code> <code>/etc/passwd</code>
5.7 next 提前结束本行处理
<code>显示以/bin/bash结尾的行,非/bin/bash结尾的行next</code>
<code># awk -F </code><code>':'</code> <code>'{if ($NF != "/bin/bash"){next} else {print $0}}'</code> <code>/etc/passwd</code>
<code>显示用户id号为偶数的用户</code>
<code># awk -F </code><code>':'</code> <code>'{if ($3%2 != 0){next} else {print $0}}'</code> <code>/etc/passwd</code>
6、数组
<a href="https://s2.51cto.com/wyfs02/M02/A5/3A/wKioL1m57wGRCsIVAABH94izTmA928.png" target="_blank"></a>
<a href="https://s3.51cto.com/wyfs02/M01/06/8A/wKiom1m574DQl3EtAAALKKWV16E484.png" target="_blank"></a>
<code>显示第一个元素</code>
<code># awk </code><code>'BEGIN{weekdays["mon"]="Monday";weekdays["thu"]="Thuseday";print weekdays["mon"]}'</code>
统计netstat状态
统计日志IP
统计/etc/fstab文件中每个单词出现的次数
统计文件系统出现的次数
<code>统计netstat -tnl 中的状态</code>
<code>1</code><code>)查看所有状态</code>
<code>netstat -tan | awk </code><code>'{print $NF}'</code>
<code>2</code><code>)# netstat -tan | awk </code><code>'{state[$NF]++}END{for (i in state){print i,state[i]}}'</code>
9
10
<code>统计日志</code>
<code>1</code><code>)查看httpd是否被安装</code>
<code>rpm -q httpd</code>
<code>2</code><code>) 启动httpd</code>
<code>service httpd start</code>
<code>3</code><code>)httpd自带压力测试工具,ab</code>
<code>ab -c </code><code>100</code> <code>-n </code><code>1000</code>
<code>4</code><code>)统计日志IP</code>
<code># awk </code><code>'{count[$1]++}END{for (i in count){print i,count[i]}}'</code> <code>/</code><code>var</code><code>/log/httpd/access_log</code>
<code>统计/etc/fstab文件中每个单词出现的次数</code>
<code># awk </code><code>'{i=1;while (i<=NF){count[$i]++;i++}}END{for (i in count){print i,count[i]}}'</code> <code>/etc/fstab</code>
<code># awk </code><code>'{for(i=1;i<=NF;i++){count[$i]++}}END{for (i in count){print i,count[i]}}'</code> <code>/etc/fstab</code>
<code>统计文件系统出现的次数</code>
<code># awk </code><code>'{print $3}'</code> <code>/etc/fstab </code>
<code># awk </code><code>'{count[$3]++}END{for (i in count){print i,count[i]}}'</code> <code>/etc/fstab</code>
7、函数
<a href="https://s2.51cto.com/wyfs02/M02/06/8B/wKiom1m585_x156HAAARyYvBxsw151.png" target="_blank"></a>
<a href="https://s4.51cto.com/wyfs02/M01/06/8B/wKiom1m59I2icVoBAAB_oXOBdAY332.png" target="_blank"></a>
统计每一个ip建立ip的个数
<code>统计每一个ip建立ip的个数</code>
<code># netstat -tnl | awk </code><code>'!/^Proto/ && !/^Active/{split($5,state,":");ip[state[1]]++}END{for (i in ip){print i,ip[i]}}'</code>
本文转自 lccnx 51CTO博客,原文链接:http://blog.51cto.com/sonlich/1965174,如需转载请自行联系原作者