版权声明:本文为博主原创文章,未经博主允许不得转载。
近来看的awk,个人认为最有用的作为总结,作为笔记,备忘。
先学习一下常见的几个宏。如图:
常见的宏有:
RS ( 输入记录之间的分隔符 )Records Seperator.
ORS ( 输入出记录之间的分隔符 )Output Records Seperator.
FS (输入记录中,每个域之间的分隔符)Fields Seperator.
OFS (输出记录中,每个域之间的分隔符)Output Fields Seperator.
NR (当前已经读的记录数)Number of Records read so far.
NF (当前记录中 的 域的个数)Number of Fields in current record.
--------------------------------
ARGC 传入的参数的个数
ARGV 传入的参数的数组
FILENAME 传入参数的文件的名字
=====================================================================
重要概念的引入:
awk把每一个以换行符结束的行称为一个记录。
记录分隔符:默认的输入和输出的分隔符都是回车,保存在内建变量ORS和RS中。
$0变量:它指的是整条记录。如$ awk '{print $0}' test将输出test文件中的所有记录。
变量NR:一个计数器,每处理完一条记录,NR的值就增加1。如$ awk '{print NR,$0}' test将输出test文件中所有记录,并在记录前显示记录号。
2. 域
记录中每个单词称做“域”,默认情况下以空格或tab分隔。awk可跟踪域的个数,并在内建变量NF中保存该值。如$ awk '{print $1,$3}' test将打印test文件中第一和第三个以空格分开的列(域)。
3. 域分隔符
内建变量FS保存输入域分隔符的值,默认是空格或tab。我们可以通过-F命令行选项修改FS的值。如$ awk -F: '{print $1,$5}' test将打印以冒号为分隔符的第一,第五列的内容。
可以同时使用多个域分隔符,这时应该把分隔符写成放到方括号中,如$awk -F'[:\t]' '{print $1,$3}' test,表示以空格、冒号和tab作为分隔符。
输出域的分隔符默认是一个空格,保存在OFS中。如$ awk -F: '{print $1,$5}' test,$1和$5间的逗号就是OFS的值。
例子一:
先打印常用的几个宏:
$ awk '{print NR, NF, ARGC,ARGV[0], ARGV[1], ARGV[2],FILENAME, FNR}' 1.txt
例子二:
用来在记录或者域内匹配正则表达式。
如$ awk '$1 ~/^111/' 1.txt 将显示1.txt文件第一列中以111开头的行。
不匹配用(!~)
例子三:
如果要取到1.txt中7777777的字段,因为他在一个记录中,并且还和8888通过“|”联系在一起。
需要通过管道来实现。
如$ awk '/777/{print $1}' 1.txt
那么输出为:
这样的话,结果中包含了“|8888”,所以管道利用上,
要取得第一个记录,所以再加上一点,
结果得到。
注意:$0指的是每一个记录。$1,$2...指的就是记录中的每一个域了。
例子四:
公司的一个探针需要进行sip测试的 server端log的打印,所以需要killall所有sip的进程(killall sipserver不停的执行,直到“no process killed”字段出现);然后启动 探针ip为183 的sip服务。
所以想用一句话的命令kill掉所有的 sip服务 。
kill -9 `ps aux | grep sipserver | awk '{print $1}'|head -100`
1、kill -9 pid 杀掉进程号为pid的进程;
2、`` 是键盘上数字1左边的一个按钮上,斜的点号;(kill -9 ` `);
3、ps aux 打印出用户的所有进程。第一列为 进程号id (即pid);
4、ps aux | grep sipserver | awk '{print $1}'|head -100
这条命令,会列出包含sipserver所有进程的id,列表中的前100个。(其实没有100个这样的进程,目的是为了全部列出)
输出结果为:如图:
这样,执行整个命令
kill -9 `ps aux | grep sipserver | awk '{print $1}'|head -100`
所有的sipserver进程就被杀掉了。