AWK 实战

产品的统计需求不断在增加,记录下操作过程吧~~~

1.批量杀死进程
1
ps -ef | grep php-fpm | awk '{printf "sudo kill %d\n", $2}' | sh
2. 统计近90天登录的用户,归类(30,60,90,120)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
原数据
162273212 18999203664 A1 1513067824
162846154 18976991999 A1 1494338665
151600666 18995410638 A1 1499221875
20638558 18978648908 A1 1511334276
118463293 18999207335 A1 1509326286
150911107 18976918588 A1 1502621711

1.首先得出当前时间戳
date +%s > 1513148221
2.用当前时间戳 - 最后登录时间 = 时间差
awk '{if (1513148221-$4 < 86400 * 30) $4=30; else if (1513148221-$4 >= 86400 * 30 && 1513148221-$4 <= 86400 * 60) $4=60; else if (1513148221-$4 >= 86400 * 60 && 1513148221-$4 <= 86400 * 90) $4=90;else if (1513148221-$4 > 86400 * 90 )$4=91;print}' jf.src > /tmp/wdk

//带括号的ifelse
awk '{ if ($2 >= 90 && $2 <= 100) {print $1,"A"} else if ($2 >= 80 && $2 < 90) {print $1,"B"} else if ($2 >= 70 && $2 < 80) {print $1,"C"} else if ($2 >= 60 && $2 < 70) {print $1,"D"} else {print $1,"E"} }' cj
3. 统计文本中同一数据出现的次数
1
2
3
4
5
6
7
1. awk '{a[$2]++}END{for(i in a)print i,a[i]}' iosA1_tj.txt
1.1 相同数累加,取出对应的key => value

2. awk '{print $2}' iosA1_tj.txt | sort | uniq -c | sort -nr | head -n 2
2.1 先排序然后uniq -c (在每列旁边显示该行重复出现的次数)
2.2 sort -nr (要以数值来排序)
2.3 head -n 2(取出最前面2个)
4. 一分为二,切割文本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
split [-bl] file [prefix]
参数说明:
-b, --bytes=SIZE:对file进行切分,每个小文件大小为SIZE。可以指定单位b,k,m。
-l, --lines=NUMBER:对file进行切分,每个文件有NUMBER行。

prefix:分割后产生的文件名前缀。

假设要切分的文件为tj_001,大小10M,10000行。

split -l 5000 test.2012-08-16_17
生成xaa,xab,xac三个文件

//指定大小切割
split -b 600k test.2012-08-16_17
split -b 500k test.2012-08-16_17 example
5. 匹配比较指定文本内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
1.利用NR FNR 两个文件行级比较
awk 'NR==FNR{a[$1]=$1" "$2 " "$6" "$7" "$8}NR!=FNR{if($1 in a)print a[$1]}' ios.new iosA1_new.txt

2.comm 比较
comm [-123][--help][--version][第1个文件][第2个文件]
比如:a.txt
1
2
3
b.txt
1
2
3
4
5
6
找出a.txt文件有而b.txt文件中没有的放在c.txt文件中
#!/bin/sh
#BEGIN
cat a.txt | sort | uniq | sort > a_u.txt
cat b.txt | sort | uniq | sort > b_u.txt
comm -23 a_u.txt b_u.txt > c.txt
# END

3. diff比较
找出a.txt文件有而b.txt文件中没有的放在c.txt文件中

比较文件的差异
#!/bin/sh
#BEGIN
cat a.txt | sort | uniq | sort > a_u.txt
cat b.txt | sort | uniq | sort > b_u.txt
diff a_u.txt b_u.txt | grep /< | awk ' $1 = " " ' > c.txt
# END
6. 补充:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
两个文件并删除相同部分
方法一:
  comm -23 file1 file2
方法二:
  grep -v -f file1 file2
  /*注::此法在对比数字时候比较凑效果,文本对比不建议使用*/
方法三:
awk '{print NR,$0}' file1 file2 |sort -k2|uniq -u -f 1|sort -k1|awk '{print $2}'
  或者:
  awk '{print $0}' file1 file2 |sort|uniq -u

1、统计两个文本文件的相同行
grep -Ff file1 file2

2、统计file1中有,file2中没有的行
grep -vFf file1 file2
grep -Fvxf <(grep -Fxf file1 file2 ) file1 file2

如何比较两个文件并去删除相同的内容
for i in $(<file1); do grep $i file2 || echo $i >>tmp1 ; done

输出相同行:
$grep -wf file1 file2

输出不同行
$grep -wvf file1 file2
-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!