引言
这个样例中,其它的都好懂,就是awk,可能如果没有接触过,就是有点不明白是怎么回事,下面简单的讲讲awk
简介
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
使用方法
awk '{pattern + action}' {filenames}
尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。
awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。
通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
调用awk
有三种方式调用awk
命令行方式
awk [-F field-separator] 'commands' input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
shell脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
相当于shell脚本首行的:#!/bin/sh
可以换成:#!/bin/awk
将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file input-file(s)
其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
几个简单的使用样例
1.查看进程的信息
adb shell ps > ps.txt
查看ps.txt
cat ps.txt
2.Awk 的默认行为
默认的时候awk 打印文件中的每一行
awk '{print;}' ps.txt
3. Awk打印匹配的行
android@tesdt-Precision-T1700:~/Desktop$ awk '/com.android.phone/' ps.txt
radio 2369 683 1510652 83040 SyS_epoll_ 0000000000 S com.android.phone
4.Awk仅打印指定的域
Awk包含许多内建的变量,对于每行的记录, Awk 默认按照空格进行分割,并将分隔后的值存入对应的 n变量中。如果一行还有4个单词,将被分别存储进 1, 2, 3, 4中,其中( 0) 代表整行。其中 $NF 代表最后一个字段
awk '{print $1, $2} ' ps.txt
root 10570
root 10659
root 10737
root 10782
root 10783
root 10815
root 10850
root 10930
shell 10945
awk '{print $1, $NF} ' ps.txt
root kworker/u16:0
root kworker/4:0
root kworker/6:1
shell ps
5.Awk开始和最后的动作
Awk包含两个重要的关键字 BEGIN 和 END
BEGIN { Actions}
{ACTION} # Action for everyline in a file
END { Actions }
在BEGIN 节中的 Actions 会在读取文件中的行之前被执行。
而END 节中的 Actions 会在读取并处理文件中的所有行后被执行。
awk 'BEGIN {print "-------start--";}
{print $1,"/t", $2,"/t", $3,"/t",$NF;}
END{print "-----------end------";
} ' ps.txt
-------start--
USER /t PID /t PPID /t NAME
root /t 10783 /t 2 /t kworker/5:0
root /t 10815 /t 2 /t kworker/u16:0
root /t 10850 /t 2 /t kworker/4:0
root /t 10930 /t 2 /t kworker/6:1
shell /t 10945 /t 655 /t ps
-----------end------
6.Awk找出员工 PID 大于 1000 的进度信息
awk '$2 > 10800' ps.txt
USER PID PPID VSIZE RSS WCHAN PC NAME
root 10815 2 0 0 worker_thr 0000000000 S kworker/u16:0
root 10850 2 0 0 worker_thr 0000000000 S kworker/4:0
root 10930 2 0 0 worker_thr 0000000000 S kworker/6:1
shell 10945 655 3788 1068 0 7f997f26ac R ps
7.Awk打印USER 为system的进程
$1代表USER,如果等于system则打印出整行
awk '$1 ~/system/' ps.txt
system 4542 683 1434148 32520 SyS_epoll_ 0000000000 S com.qualcomm.qti.notificationservice
system 4917 683 1436844 34788 SyS_epoll_ 0000000000 S org.simalliance.openmobileapi.service:remote
system 4928 683 1435396 33368 SyS_epoll_ 0000000000 S com.qualcomm.display
system 10546 683 1464360 36076 SyS_epoll_ 0000000000 S com.android.settings
system 10558 683 1457292 34904 SyS_epoll_ 0000000000 S com.qualcomm.qti.ext
~操作符是和正则表达式中的值进行比较,如果匹配则打印整行
参考资料
1.http://blog.csdn.net/andyxm/article/details/5964071
awk print 学习