awk 'BEGIN {初始化} Pattern1 {处理} ... PatternN {处理} END {清理}' 文件
注意事项:
awk '{print($1);}' input
{print($1);}
,然后在命令中引用文件awk -f script.awk input
BEGIN和END是特殊的Pattern,除此以外可以使用的Pattern还有3种: 正则表达式、布尔操作、 特殊模式
/admin/
/^admin/
/admin$/
/^[0-9.]+ /
/(POST|PUT|DELETE)/
$2 ~ /[0-9]+/ && $3 !~ /[a-z]+/ && $2 > 189000
/.../
[0-9.]
~ /../
和!~ /.../
&& || !
> >= < <= ==
==
~ !~
/admin.html$/ && $2 == "DELETE"
这里的变量值可以是awk的任意内置变量,如我们需要大于第一个行或匹配特定正则的行,我们可以这样写:
ps -ef | awk 'NR ==1 || /track-log-server/ {print $0;}'
awk中的循环语句同样借鉴于C语言,支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。
{ print $0; }
{ exit; }
{ next; }
{ a=$1; b=$0 }
{ c[$1] = $2 }
{
if (BOOLEAN) {
ACTION
} else if (BOOLEAN) {
ACTION
} else {
ACTION
}
}
{
for (i=1; i
{
for (item in c) {
ACTION
}
}
function name(parameter-list) {
ACTIONS; # same actions as usual
}
function add1(val) {
return val+1;
}
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
NF 浏览记录的域的个数
NR 已读的记录数
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
RS 控制记录分隔符
OFS 输出域分隔符
ORS 输出记录分隔符
$0 当前行
$1..$n 用FS分割后的第1到n个字段
http://www.gnu.org/software/gawk/manual/gawk.html#Functions
awk -F ':' '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%sn",FILENAME,NR,NF,$0)}' /etc/passwd
awk '{printf "%-8s %-8s %-8s %-18s %-22s %-15s\n",$1,$2,$3,$4,$5,$6}' netstat.txt
awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd
tail -10 WebAdWatchLog_2019091613.log | cat -A | awk '{b=split($0,a,"\\^A");print($0);print(a[b]);}'
$cat as.sh | awk -p '/[Aa]ttach/ {idx=match($0,/([Aa]ttach_([a-z]+))/,arr) ;if(idx != 0) print $0, arr[1], arr[2];}'
attach_jvm() attach_jvm jvm
$cat as.sh | awk -p '/[Aa]ttach/ {idx=index($0,"attach_jvm");
if(idx >0) { print $0, idx, idx + length("attach_jvm"), substr ($0, idx + length("attach_jvm")); }}'
attach_jvm() 1 11 ()
cat 000000_0 | awk 'BEGIN{FS="\x01"} {print $1}' | head -10