很久之前就不是很系统的学习了linux常用的处理字符的命令.虽然当时学习进展自己也很满意.但是过后又容易忘记.
现在系统的学了linux的shell命令.简单的总结一下:
cut顾名思义,用来把目标砍成一段一段的.简单看下用法.
cut [-b | -c | -f ] "数字" -d "seprate" --complement --output-delimiter
-b以字节为单位进行分割
-c以字符为单位进行分割
-f以单词为单位进行分割.
说实话,-b-c我实在不知道该怎么区分,怎么用也看不出区别.至少规则文件,一个自己就是一个字符啊.
这三个选项后面可以跟数字,比如:
cut -f 1 filename 表示仅仅显示第一列
cut -f 1,2 filename 表示显示1和2列
cut -f 1-4 filename 表示显示1到4列
-d 指定分割符.默认是\t.这个后面用一个小例子说明一下,吃过亏,往往记得牢.
--complement 取补集.不难理解对吧.
--output-delimiter 输出分隔符.
常用的就是这些.下面结合我的一个乌龙来简单的用一下cut.
我用vim编辑了一个规则的文件.
No Name Mark Percent 1 Sarath 45 90 2 Alex 49 98 3 Anu 45 90满以为结果会完全和预期一样.结果被打脸.
相信原因一目了然,无非就是分隔符的问题.
为什么会有这种问题呢.我明明键入的时候,用的是tab啊.
这要从vim说起.
vim有个命令叫set expandtab.可能是为程序员专门这几的,目的是将tab拓展成指定宽度个数的空格.所以看似它是tab,其实已经替换成空格了.
怎么办呢?
先说说怎么查看是否有tab分割.
1. 如果在vim下.冒号set list .就可以查看分隔符的类型了.换行是$ , tab是^I .一幕了然.我得vim因为没有tab结果就是这样的.
2. 如果不在vim环境下,也好办,用cat -T .也可以查看.结果不贴了.
怎么解决呢?方法也有很多种.
1. 同样先从vim环境下说起吧.确认没有tab以后首先:set noexpandtab . 然后:%s/ \+/\t/g
就可以了.注意千万不要把+换成*.会死的很惨.正则表达式里面,+的意思是至少有一个,而*号的意思是可以没有.
2. sed命令解决.正则是一样的.sed -i "s/ \+/\t/g"
3. tr命令解决:要稍微绕一点.tr命令回头再详细介绍.先领略一下它的魅力. tr -s " " < filename | tr " " "\t"
补充: tr职能从标准输入接受数据.其输出只能到标准输出.同学们如果要用这个命令,不要忘记在最后重定向一下.
-s 去除其后面接的参数的重复,只保留一个. 然后在把空格替换成\t
好滴,修改以后的文件使用cat看下:
ok.看下各个场景的结果吧.
补充一点: -f -c -b后面可以接的数字类型:
n,m 打印n和m
n-m 打印n到m
n- 从n开始打印直到最后
-m 从头开始打印直到m
ok,就总结这么多吧.有兴趣的同学,可以立刻就敲敲,加深一下印象.
原文地址:http://blog.csdn.net/cp3alai/article/details/43602317