您的位置:首页 > 运维架构 > Linux

Linux下文本常用处理技巧

2015-08-23 20:36 381 查看

在Linux系统下常用的脚本技巧

在Linux使用过程中,对文件进行简单处理是经常会遇到的。如果会写一些简单的shell脚本,可以非常高效且迅速的实现。比如进行一些去重,排序,合并,预处理等。Sed和Awk是两个很强大的工具,使用这两个工具可以在使用很少的几行代码快速解决很多复杂的问题。这里分享几个常用的sed,awk实例,帮助大家快速上手进行一些文件的预处理。

下面我们以一个3000000行的文件为例,来介绍几个常用的编辑处理脚本。

场景1:第一列数据相同,则第N列数据累加

输入数据:
55 2068870351 80
13 2115249545 9
32 495625872 1
42 1990048054 3
44 2314768737 1
53 1090424700 197
19 1943278105 7
19 1713692517 1
50 1041581028 11
59 43828334 52


实现脚本:
$cat tmp | awk '{print $1,$3}' | awk '{a[$1]+=$2;}END{for (i in a) print i,a[i];}' | sort -nrk1 > tmp1;

返回结果:
$cat tmp1
63 33373905
62 37142052
61 37997106
60 33018517
59 46855456
58 39230729
..
1 34158015
0 52804783

关键点解释:
用awk提取第一列,第三列信息。因awk是一行一行读取,把第一列作为数组标示,第二列的数据累加。最后在END处打印所有读取的信息。最后以第一列逆序排序。

执行时间对比:
$time
real    0m2.458s
user    0m2.372s
sys     0m0.091s

从这里大家可以看出,我们只花了2.45s就能完成一个三千万文件的遍历和列累加,效率还是杠杠的。


场景2:对多个文件内容进行合并,以及排序

输入数据:

==> tmp1 <==
63 33373905
62 37142052
61 37997106

==> tmp2 <==
34386 63
34699 62
34372 61


实现脚本:
$paste tmp2 tmp1 | awk '{print $2,$1,$4}' | sort -k2,2nr -k3,3nr > result.txt

返回结果:
8 35097 42652653
51 34945 41733369
5 34912 45073340
30 34775 52006607
0 34729 52804783

关键点解释:
使用paste可以让两个文件列合并,后面使用sort分别对第二,三列数据进行排序。针对这类文件处理列合并加排序,用脚本可以非常迅速的输出结果,且非常高效。

执行时间对比:
$time
real    0m0.002s
user    0m0.000s
sys     0m0.003s


场景3:对一个文件常用修改操作

在文件的修改中,可以使用sed命令帮助大家修改。这里列一些常见的命令。

实现功能:把一行中的内容A修改成B, 内容C修改成D。
$cat 1.txt
anc&and.q=1234&asdsadfg
anc 1234
asd dfgf12
dfg 2345

脚本:
$sed   -e 's/anc/test_anc/g; s/asd/ASD/g'  1.txt

输出结果:
test_anc&and.q=1234&ASDsadfg
test_anc 1234
ASD dfgf12
dfg 2345


实现功能:把一行中包含and.q的行中的1234替换成test1234
$sed '/and.q/s/1234/test123/' 1.txt
anc&and.q=test123&asdsadfg
anc 1234
asd dfgf12
dfg 2345


实现功能:把一行中包含and.q的行中的1234替换成test1234

$sed '/and.q/s/1234/test123/' 1.txt
anc&and.q=test123&asdsadfg
anc 1234
asd dfgf12
dfg 2345


实现功能:在第二行插入内容test 123

$sed '2 i test 123' 1.txt
anc&and.q=1234&asdsadfg
test 123
anc 1234
asd dfgf12
dfg 2345


实现功能:在第二行后追加内容test 123

$sed '2 a test 123' 1.txt
anc&and.q=1234&asdsadfg
anc 1234
test 123
asd dfgf12
dfg 2345


实现功能:删除文件奇数行内容

$cat 1.txt
anc&and.q=1234&asdsadfg
anc 1234
asd dfgf12
dfg 2345

$sed '1~2 d' 1.txt
anc 1234
dfg 2345


实现功能:删除文件偶数行内容
$sed '2~2 d' 1.txt
anc&and.q=1234&asdsadfg
asd dfgf12


实现功能:删除关键字anc所在的行内容
$sed '/anc/ d' 1.txt
asd dfgf12
dfg 2345


看了上面这些,大家有没对sed的编辑有所了解?有兴趣的同学可以去man下sed,awk。这两个工具非常强大,能满足很多文件的处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: