AWK Linux文本分析工具
- AWK是一种速度较快,功能齐全的文本分析工具,可以用来读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,
实际上 AWK 的确拥有自己的语言:AWK 程序设计语言,允许我们创建简短的程序完成对文本文件的分析; - AWK默认已经安装在linux系统中,因此我们不需要安装就可以使用,默认情况下,AWK以空字符分割列,当然我们可以配置这个分隔符;
基本语法示例
awk 'BEGIN {program} /search_pattern/ { action_to_take_on_matches; another_action; } END {program}' file_to_parse
awk 'BEGIN {FS=":"; print "User\t\t\tUID\t\t\tGID\t\t\tHome\t\t\tShell\n---------------------------"} /root/ {print $1,"\t\t\t",$3,"\t\t\t",$4,"\t\t\t",$6,"\t\t\t",$7;} END {print "-----------------\nFile Complete!"}' /etc/passwd
默认情况下,我们可以省略Search Pattern和action,如果action被省略,AWK会将其设置为默认值’print’,打印所有行
函数,流程控制请看下面
请看第7篇参考文档
AWK内置变量
参数名称 | 参数解释 |
---|---|
ARGC | 命令行参数个数 |
ARGV | 命令行参数排列 |
ENVIRON | 支持队列中系统环境变量的使用 |
FILENAME | awk浏览的文件名 |
FNR | 浏览文件的记录数 |
FS | 设置输入域分隔符,等价于命令行 -F选项 |
NF | 浏览记录的域的个数 |
NR | 已读的记录数 |
OFS | 输出域分隔符 |
ORS | 输出记录分隔符 |
RS | 控制记录分隔符 |
使用举例
echo “1 carrot sandy
2 wasabi luke
3 sandwich brian
4 salad ryan
5 spaghetti jessica” > favorite_food.txt
匹配在第二列中以’sa’开头的事务,
awk '$2 ~ /^sa/' favorite_food.txt
匹配行中第二列不易’sa’开头的事务,用此表达式:
awk '$2 !~ /^sa/' favorite_food.txt
- |命令 | 解释 |
|————————————-|:——————-:|
|awk ' {print $1,$3} ' file
|打印第一列和第三列
|awk ' {print $0} ' file
| 带音整行,$0表示整行内容,毕竟AWK是以行为处理单位的嘛
|awk '/pattern/ {print $2}' file
| 打印匹配行的第二列
|awk -f awk_script.awk file
| 和sed一样,awk也可以将处理命令放在一个脚本文件中,使用-f参数引入
|awk 'BEGIN {print "hello world"}'
| 在输出处理结果之前先输出依据hello word
|awk -F "" 'program' files
| 设置文件中行以null作为分隔,也就是空格,TAB等
|awk -F "regex" 'program' files
| FS也可以被设置为正则表达式
|awk 'BEGIN { for (i = 1; i <= 7; i++) print int(101 * rand()) }'
| 打印0到100的随机数
|awk -F: '{ print $1 }' /etc/passwd | sort
| 输出系统用户名并且排序
|awk 'END { print NR }' inputfile
| 打印文件的行数,NR意思是Number Rows
|awk 'NR % 2 == 0' data
| 打印文件奇数行
|awk '$1 ̃/J/' inputfile
|在所有输入行的第一列中匹配以J开头的行
|awk '$1 ̃!/J/' inputfile
| 和上面相反
|echo aaaabcd | awk '{ sub(/a+/, "<A>"); print }'
| 在aaaabcd中匹配aaaa并且用…替换,sub是一个AWK函数
|echo a b c d | awk '{ OFS = ":"; $2 = ""; print $0; print NF }'
| OFS 是Output Field Separator 的缩写,这个语句将输出”a::c:d”
|echo a b c d | awk '{ OFS = ":"; $2 = ""; $6 = "new";print $0}'
|输出a::c:d::new
|awk -n '/^root/{p;q;}' /etc/passwd
|打印第一个匹配的结果
|awk -F\\\\ ’...’ inputfiles ...
| 设置FS为\
|awk 'BEGIN { OFS = ";"; ORS = "\n\n" } { print $1, $2 }' inputfile
| 设置输出列分隔符和行分隔符
|awk 'BEGIN { OFMT = "%.0f"; print 17.23, 17.54 }'
| 设置浮点数输出格式输出
|awk 'BEGIN {msg = "Dont Panic!";printf "%s\n", msg}'
}| 像C语言一样输出字符串 - 一个awk脚本例子
1 #! /bin/awk -f
2 BEGIN {FS=”:”; print “User\t\t\tUID\t\t\tGID\t\t\tHome\t\t\tShell\n—————————”}
3 /root/ {print 1,"\t\t\t", 3,”\t\t\t”, 4,"\t\t\t", 6,”\t\t\t”,$7;}
4 END {print “—————–\nFile Complete!”}
执行./awk.awk /etc/passwd
查看系统用户内容 参考文档
- https://www.digitalocean.com/community/tutorials/how-to-use-the-awk-language-to-manipulate-text-in-linux
- https://linuxconfig.org/learning-linux-commands-awk
- http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html
- http://www.gnu.org/software/gawk/manual/gawk.html
- http://www.grymoire.com/Unix/Awk.html
- http://www.cyberciti.biz/faq/bash-scripting-using-awk/
- http://www.computerhope.com/unix/uawk.htm