awk命令

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

原文地址:https://www.cnblogs.com/godlove/p/11479909.html