假设你已经会用所有的流编辑器
统计下流编辑器
1、tr
转换字符
替换:可以使用字符集的形式。如tr [a-z] [A-Z] 或者 tr a-z A-Z
压缩:-s 如echo “you are a man ”|tr -s ' ' ' ' 结果you are a man
删除:-d 如echo "you are a man"| tr -d ' '结果youareaman
2、cut
剪切一段字符或字节
可以使用-c,-b,-f来指定分割字符,字节和域
3、paste
粘贴,也就是合并文件用的
使用制表符来合并多个文件对应的行,也可以使用 -d 指定合并符
实例:
默认制表符
paste p3.txt p2.txt p1.txt
指定
paste -d ‘*‘ p3.txt p2.txt p1.txt
so,也不需要和其他的对比了,其他都是拆分,而paste是合并。
4、sed
功能很强大,替换删除打印都可以
侧重整行
5、awk
功能牛叉
6、grep
g (globally) search for a re (regular expression ) and p (print ) the results.
实例:
1、字符替换
在字符替换方面,tr还是比较好用的。
如:“avcd” 替换成"AVCD"
echo "avcd" | tr '[a-z]' '[A-Z]'
sed,awk,grep更擅长处理字符串了
echo “avcd” | sed 's/[a-z]/[A-Z]/g'
输出结果是:[A-Z][A-Z][A-Z][A-Z]
2、字符串替换
字符串操作的话,tr就得良弓藏了
将string 替换成int
echo "stringstringstring string" | sed 's/string/int/g'
awk,sed,grep,cut都是以行为单位来存储
3、我想操作指定位置的字符,字节
那么cut就当仁不让了。
$cat size.txt
hello world
你好,伟大的程序员先生!
$cut -b 1-3 < size.txt
hel
你
$cut -b 1-2 < size.txt
he
$cut -b 1-2 < size.txt |sed -n l
he$
\344\275$
其实第二行是有内容的。
$cut -b 1-2,7-8 < size.txt |sed -n l
hewo$
\344\275\357\274$
$cut -c 1-3 size.txt
hel
你
需要注意的是在ubuntu中不知到为什么-c和-b没区别
4、匹配字符串,然后输出
文本处理中的一个很重的一部分,sed,grep,awk,cut都可以胜任。
$cat size.txt
1:2:3
1:2:3
4:5:6
2:9:10
ni:hao:ni:d
ow:ds:dfg:dfs
1、我想得到第三列的数据
cut:
$cut -d ':' -f 3 size.txt
3
3
6
10
ni
dfg
sed:
$sed 's/.*:.*:\(.*\).*/\1/' < size.txt
3
3
6
10
d
dfs
注意:sed是贪婪匹配,不支持非贪婪匹配,而且匹配起来也麻烦
grep:
使用正则表达式搜索文本,并把匹配的行打印出来,可以看出grep主要是匹配然后输出整行,显然对此也无能为力了。
awk:
非常强大,用在这个里面有点屈才了。
awk -F: '{print $3}' < size.txt
跟cut比,awk可以指定多个分割符
$cat size.txt
1:;2:;3
1:;2:;3
4:;5;:6
2:;9:;10
ni:;hao:;ni:d
ow:;ds:;dfg:dfs
sdjh:da:;sfjh
$awk -F '[:;]' '{print $3}' < size.txt |sed -n l
2$
2$
5$
9$
hao$
ds$
$
对于这样的需求,cut只能靠边当小弟了
2、搜索某一行是否存在某个string
显然grep,sed,awk都是可以的
简单的话就用grep,因为grep支持非贪婪匹配
$cat size.txt
aaaadsdsaaaaaadsa
aaaaaaddf
fdsgaaadf
afgfssaaghg
我想匹配某一行有一个或两个a的行
$sed -n '/[^a]aa\?[^a]/p' < size.txt
afgfssaaghg
sdafdhh
$grep -E '[^a]a{1,2}[^a]' < size.txt
感觉还是grep对正则支持的很好
3、搜索一个有固定格式文件的某一列是否存在string,
显然awk很easy,而用sed的话得先搜索到,然后在使用正则替换,会很麻烦。
就这样吧,具体的还的认真学习。