awk 根据定位到到数据行处理其中到分段,用于数据切片
awk 'BEGIN{}END{}' # 开始和结束
awk '/Running/' # 正则匹配
awk '/aaa/,/bbb/' # 区间选择
awk '$2~/xx/' # 字段匹配
awk 'NR==2' # 取第二行
awk 'NR>1' # 去掉第一行
'$9~/500/' /tmp/nginx.log #默认以空格为分隔符,匹配第九位数据500
awk '$9!~/200/' /tmp/nginx.log # 匹配第九位状态码非200的数据
awk 字段数据处理
-F 参数指定字段分隔符
RS 行记录分隔符
FS 字段分隔符
NR 记录数
NF 字段数
BEGIN{FS="_"} 也可以表示分隔符
$0 代表原来的行‘
$1 代表第一个字段
$N 代表第N个字段
$NF 代表最后一个字段
$ cat file1
a
b
c
$ cat file2
d
e
$ awk '{print FILENAME, NR, FNR, $0}' file1 file2
file1 1 1 a
file1 2 2 b
file1 3 3 c
file2 4 1 d
file2 5 2 e
awk '$9!~/200/{print $9}' /tmp/nginx.log 找出第九个字段不等于状态码为200的字段,并打印出来
awk '$9!~/200/{print $9}' /tmp/nginx.log |sort | uniq -c 找出符合条件的字段后,进行排序去重
awk '$9=="404"' /tmp/nginx.log # 只查询符合条件的结果
seq 10 | awk '/^..$/'
10
seq 10 | awk '/^3$/'
3
seq 20 | awk '/15/,/19/'
15
16
17
18
19
seq 20 | awk 'NR==8' 打出行数
8
综合运用:
前1000行数据,在log日志中找出访问量最高的IP地址
head -1000 /tmp/nginx.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -5
awk '/00:00:01/,/00:00:09/' /tmp/nginx.log 打出1-9之间的数据
awk '$9!~/200/{print $7}' /tmp/nginx.log |sort | uniq -c | sort -nr| less 查找排序去重并打印行数 -c 参数显示文件中每行连续出现的次数
awk '$9!~/200/{print $7}' /tmp/nginx.log | sed -E 's/[0-9]{3,}/_d_/g' |sort | uniq -c | sort -nr| less # sed -E 's/[0-9]{3,}/_d_/g' 正则替换0-9并3位以上的数据替换为_d_,g为全部替换
awk '$9!/200/{print $7}' /tmp/nginx.log | sed -E 's/[0-9]{3,}/_d_/g' | sort| uniq -c | sort -nr | head -5 取出前5的数据
echo "123|456|789" | awk -F '|' '{print $0} -F指定分隔符,不指定分隔符时,默认以空格作为分隔符 打印的结果为:123|456|789 $0代表全域(范围)
echo "123|456|789" | awk -F '|' '{print $1}' 打印的结果为:123 $1代表第一个域(范围)
echo "123+456_789" | awk -F '+|_' '{print $2}' 这里的|是或的意思,以+或-为分隔符的意思
last -n 5 显示当前5个用户
last -n 10 | awk '{print $1}' 打印第一排的ID
cat passwd | awk -F ':' '{print $1}' 以:为分隔符打印第一列数据
cat passwd | awk -F ':' '{print $1 " "$7}'
curl -s http://www.baidu.com/s?wd=mp3 | grep -o "结果约[0-9,]*" | awk -F '个|约' '{print $2}' 打印的结果为:64,300,000 以个或约作为分隔符
echo -e "1|2|3
4|5|6
7|8|9" | awk -F '|' 'BEGIN{a=0}{a=a+$2}END{print a}'
结果为:15,即每一列的第二位数相加2+5+8
echo -e "1|2|3 4|5|6 7|8|9" | awk -F '|' 'BEGIN{a=0}{a=a+$2;print $2}END{print a}'
输出的结果为:
2
5
8
15