处理字符串
提取字符串第三字符串
echo 'this is a test' |awk '{print $3}'
替换 字符串中一个
echo "Hello Tom" | awk '{$2="Adam"; print $0}'
输出:
Hello Adam
利用变量 菜鸟
$NF 表示当前行有多少个字段,
因此
$NF
就代表最后一个字段。
echo 'this is a test' | awk '{print $NF}'
输出:
test
$(NF-1)
代表倒数第二个字段
echo 'this is a test' | awk '{print $(NF-1)}'
输出:
a
2 .变量NR
表示当前处理的是第几行。
处理文件
处理文件 logs.txt , 文件内容:
07.46.199.184 [28/Sep/2010:04:08:20] "GET /robots.txt HTTP/1.1" 200 0 "msnbot"
123.125.71.19 [28/Sep/2010:04:20:11] "GET / HTTP/1.1" 304 - "Baiduspider"
获取第一列数据
awk '{print $1}' logs.txt
输出:
07.46.199.184
123.125.71.19
这个文件的字段分隔符是冒号(:
),所以要用-F
参数指定分隔符为冒号。然后,才能提取到它的第一个字段。
awk -F ':' '{print $1}' logs.txt
输出:
07.46.199.184 [28/Sep/2010
123.125.71.19 [28/Sep/2010
提取log 的时间
awk '{print $2}' logs.txt | awk 'BEGIN{FS=":"}{print $1}' | sed 's/\[//'
输出:
28/Sep/2010
28/Sep/2010
**统计某一个字段的相加 **
每次都大于结果
awk '{a+=$(NF-2); print "Total so far:", a}' logs.txt
Total so far: 200
Total so far: 504
执行完后在打印结果
awk '{a+=$(NF-2)}END{print "Total:", a}' logs.txt
输出:
Total: 504
利用变量
- OFS: 输出字段分隔符变量
OFS(Output Field Separator) 相当与输出上的 FS, 默认是以一个空格字符作为输出分隔符的,下面是一个 OFS 的例子:
正常空格命令:
awk '{print $1, $3;}' logs.txt
输出结果:
07.46.199.184 "GET
123.125.71.19 "GET
注意命令中的 print 语句的, 表示的使用一个空格连接两个参数,也就是默认的OFS的值。因此 OFS 可以像下面那样插入到输出的字段之间:
awk 'BEGIN{OFS="=>";}{print $1, $3;}' logs.txt
输出:
07.46.199.184=>"GET
123.125.71.19=>"GET
注意: GET 前面多一个双引号,我们需要去掉
awk '{print $1, $3;}' logs.txt |sed 's/\"//'
awk 'BEGIN{OFS="=>";}{print $1, $3;}' logs.txt |sed 's/\"//'
输出:
07.46.199.184 GET
123.125.71.19 GET
07.46.199.184=>GET
123.125.71.19=>GET
- 变量
NR
表示当前处理的是第几行。
awk '{print NR") "$1}' logs.txt
输出:
1) 07.46.199.184
2) 123.125.71.19
变量 NF 表示一列的最后一个字段
$(NF-2) 表示倒数第三个字段
利用 if 判断倒数第三个字段 是否 等于 200
awk '条件 动作' 文件名
awk '{if ($(NF-2) == "200") {print $0}}' logs.txt
输出:
07.46.199.184 [28/Sep/2010:04:08:20] "GET /robots.txt HTTP/1.1" 200 0 "msnbot"
处理进程
- 根据 lsof 命令获取进程 PID
lsof -i:3100|awk 'NR>1' |awk '{print $2}'
kill -9 进程
lsof -i:3100|awk 'NR>1' |awk '{print $2}' | xargs kill -9
NR 大于 1 表示从第二行开始
输出:
2299757
2299757
2299757
2299757
2299757
2299757
2299757
2299757
2299757
2410946
统计文件中的数量
查询 file 文件中 haha 的数量
awk -v RS='haha' 'END {print --NR}' file
或者使用 grep
grep -o 'haha' file | wc -l
查询使用端口
ss -nutlp | awk '{print $1,$5}' | awk -F"[: ]" '{print "协议:"$1, "端口号:"$NF}'|grep "[0-9]"|uniq