shell中最强大,实用的命令awk

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell中最强大,实用的命令awk相关的知识,希望对你有一定的参考价值。

参考技术A awk是一个文本处理工具,通常用于处理数据并生成结果报告

语法格式

第一种形式

语法格式解释

BEGIN正式处理数据之前

pattern匹配模式

commands匹配命令,可能多行

END处理完所有匹配数据后执行

第二种形式

内置变量含义

$0整行内容

n当前行的第1-n个字段(按照指定分隔符分割后)

NF(Number Field)当前行的字段个数,也就是多少列

NR(Number Row)当前行的行号,从1开始计数

FNR(File Number Row)多文件处理时,每个文件行号单独计数,都是从0开始

FS(Field Separator)输入字段分割符。不指定默认以空格或者Tab键分割

RS(Row Separator)输入行分割符。默认回车\n

OFS(Output Field Sepatator)输出字段分割符。默认为空格

ORS(Output Row)输出行分隔符。默认为回车

FILENAME当前输入的文件名字

ARGC命令行参数个数

ARGV命令行参数数组

需要指定分隔符:

不需要指定分割符,默认空格,tab键,多个也可以分隔(如一个空格+一个tab键)

show.txt文件内容如下

输出如下:

输出如下

可以用这个输出每一行的最后一列的值

输出如下(没有混合使用,例子比较简单)

show.txt的文件内容如下

先输出每一行数据

输入如下

输出每一行的第二列

输出如下

在上面基础上指定行分隔符

输出如下

再次指定列分隔符

输出如下

show.txt的文件内容如下

输入如下,因为是对行进行处理,所以有几行,输出几次文件名

jps -l输入如下,运行的服务如下

想关闭mbase-spider-1.0.jar这个jar包的服务,可以写一个如下脚本,非常方便,更高阶用法另开一篇文章好好写写

SHELL用法九(awk练习)

1、SHELL编程Awk语句案例实战
Awk主要是用于对文本文件进行处理,通常是逐行处理,其语法参数格式为,
AWK常用参数、变量、函数详解如下:
awk  pattern + {action}file
(1) AWK基本语法参数详解:
单引号是为了和shell命令区分开;
大括号{ }表示一个命令分组;
pattern是一个过滤器,表示匹配pattern条件的行才进行Action处理;
action是处理动作,常见动作为Print;
使用#作为注释,pattern和action可以只有其一,但不能两者都没有。
(2) AWK内置变量详解:
FS 分隔符,默认是空格;
OFS 输出分隔符;
NR 当前行数,从1开始;
NF 当前记录字段个数;
$0 当前记录;
$1~$n 当前记录第n个字段(列)。
(3) AWK内置函数详解:
gsub(r,s):在$0中用s代替r;
index(s,t):返回s中t的第一个位置;
length(s):s的长度;? match(s,r):s是否匹配r;
split(s,a,fs):在fs上将s分成序列a;
substr(s,p):返回s从p开始的子串。
(4) AWK常用操作符,运算符及判断符:
++ --
增加与减少( 前置或后置);
^ **
指数( 右结合性);
! + -
非、一元(unary) 加号、一元减号;
+ - * / %
加、减、乘、除、余数;
< <= == != > >=
数字比较;
&&
逻辑and;
||
逻辑or;
= += -= *= /= %= ^= **=
赋值。
(5) AWK与流程控制语句:
if(condition) { } else { };
while { };
do{ }while(condition);
for(init;condition;step){ };
break/continue。
常用AWK工具企业演练案列:
(1) AWK打印硬盘设备名称,默认以空格为分割:
df -h|awk ‘{print $1}‘
(2) AWK以空格、冒号、 、分号为分割:
awk -F [ :	;] {print $1}   jfedu.txt
(3) AWK以冒号分割,打印第一列,同时将内容追加到/tmp/awk.log下:
awk -F: {print $1 >>"/tmp/awk.log"} jfedu.txt
(4) 打印jfedu.txt文件中的第3行至第5行,NR表示打印行,$0表示文本所有域:
awk NR==3,NR==5 {print}  jfedu.txt
awk NR==3,NR==5 {print $0} jfedu.txt
(5) 打印jfedu.txt文件中的第3行至第5行的第一列与最后一列:
awk NR==3,NR==5 {print $1,$NF}  jfedu.txt
(6) 打印jfedu.txt文件中,长度大于80的行号:
awk length($0)>80 {print NR}  jfedu.txt
(7) AWK引用Shell变量,使用-v或者双引号+单引号即可:
awk -v STR=hello {print STR,$NF}  jfedu.txt
STR="hello";echo| awk {print "${STR}";}
(8) AWK以冒号切割,打印第一列同时只显示前5行:
cat /etc/passwd|head -5|awk -F: {print $1}
awk -F: NR>=1&&NR<=5 {print $1} /etc/passwd
(9) Awk指定文件jfedu.txt第一列的总和:
cat jfedu.txt |awk {sum+=$1}END{print sum}
(10) AWK NR行号除以2余数为0则跳过该行,继续执行下一行,打印在屏幕:
awk -F: NR%2==0 {next} {print NR,$1} /etc/passwd
(11) AWK添加自定义字符:
ifconfig eth0|grep "Bcast"|awk {print "ip_"$2}
(12) AWK与if组合实战,判断数字比较:
echo 3 2 1 | awk { if(($1>$2)||($1>$3)) { print $2} else {print $1} }
(13) AWK与数组组合实战,统计passwd文件用户数:
awk -F : BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i =0; i < NR; i++) print i, name[i]} /etc/passwd
(14) awk分析Nginx访问日志的状态码404、502等错误信息页面,统计次数大于20的IP地址。
awk {if ($9~/502|499|500|503|404/) print $1,$9} access.log|sort|uniq –c|sort –nr | awk {if($1>20) print $2}
(15) Awk统计服务器状态连接数:
netstat -an | awk /tcp/ {s[$NF]++} END {for(a in s) {print a,s[a]}}
netstat -an | awk /tcp/ {print $NF} | sort | uniq -c

 

以上是关于shell中最强大,实用的命令awk的主要内容,如果未能解决你的问题,请参考以下文章

shell awk 常见命令

shell awk 常见命令

awk 命令行

linux里面的sed命令怎么用,做啥的?请详细说明

awk命令之小结1

shell中,awk命令的$0是啥意思?