kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

awk命令

split

1
cat access_log | grep -vE 'zzapi/post/|matomo|^"::1"' | awk -F'" "|"$| "' '{ split($1, r, " "); lr=length(r); printf("INSERT INTO ac(exec,d,t,time,dip,dport,sip,sport,code,byte,method,http,host,url,args,referer,agent,sslp,sslc) VALUES(\"httpd\""); for (i=1;i<=lr;i++) printf(",\"%s\"", r[i]); for (i=2;i<NF && i<9;i++) printf(",\"%s\"", $i); print ");"; }' | head -10

统计列和

1
awk 'BEGIN { sum+=$1; } END { print sum }'

-F 参数自定义分隔符可以用正则表达式

1
awk -F '[ ;]+' '{print $2}'

http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html

实例

1
2
3
last -n 5 | awk  '{print $1}'
cat /etc/passwd |awk  -F ':'  '{print $1"\t"$7}'
cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'

awk内置变量

1
2
3
4
5
6
7
8
9
10
11
ARGC            命令行参数个数
ARGV            命令行参数排列
ENVIRON         支持队列中系统环境变量的使用
FILENAME        awk浏览的文件名
FNR             浏览文件的记录数
FS              设置输入域分隔符,等价于命令行 -F选项
NF              浏览记录的域的个数
NR              已读的记录数
OFS             输出域分隔符
ORS             输出记录分隔符
RS              控制记录分隔符

此外,$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,……以此类推。

print和printf

awk中同时提供了print和printf两种打印输出的函数。

其中print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。

printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。

awk编程

变量和赋值
1
2
# 统计/etc/passwd的账户人数
awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd
条件语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if (expression) {
	statement;
	statement;
	... ...
}

if (expression) {
	statement;
} else {
	statement2;
}

if (expression) {
	statement1;
} else if (expression1) {
	statement2;
} else {
	statement3;
}
循环语句

awk中的循环语句同样借鉴于C语言,支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。

数组

因为awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)。值和关键字都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现,它们并不是按照你预料的顺序显示出来的。数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。

显示/etc/passwd的账户

1
2
3
4
5
6
7
8
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
0 root
1 daemon
2 bin
3 sys
4 sync
5 games
......