cut - Linux下小巧的文本截取工具
简介
cut命令是Unix下的一个命令行程序。cut命令是以行为单位来处理的。cut命令处理的是标准输入,所以可以结合管道来进行文本的处理。
命令格式
cut option… [file]…
cut命令的option部分可以是如下的一些选项:
-b, --bytes=LIST 选择指定数目LIST的字节
-c, --characters=LIST 选择指定数目LIST的字符
-d, --delimiter=DELIM 使用DELIM作为内容的分隔符,而不是使用默认的制表符(tab)作为分隔符
-f, --fields=LIST 选择LIST指定的LIST部分内容,输出选中的内容,并且如果字符没有包含分隔符,则也同样输出,除非指定了-s选项
-n 和-b一起使用,表示在选择字节的时候,对于多字节的字符不进行分隔,多字节的字符被看作一个字节
-s, --only-delimited 不输出不包含分隔符的行
--output-delimiter=STRING 使用STRING作为输出内容中的分隔符,而不是使用原来标准输入中的分隔符。
Note:对于选项-b, -c, -f,只能在一个命令被指定其中的一项。
命令结果的输出的顺序和待处理数据在输入时的顺序是一样的。
对于一个LIST,可以是一个范围,也可以是多个由逗号分隔的多个范围。
LIST的格式:
N 表示指定N个数据单元,计数从1开始
N- 从第N个数据单元开始到行结束
N-M 从第N个数据单元到第M个数据单元(包括)
-M 从行的开始到底M个数据单元(包括)
其中的数据单元可以是:字节,字符,数据块
Note:如果命令中没有指定FILE或者FILE是"-",则默认是读取标准输入。
用法
在Linux下环境变量PATH中包含了由”:”分隔的变量的查找路径,假设我们需要截取其中的其中的第二个路径,则可以使用如下的方法:
echo $PATH | cut -d ':' -f 2
如果需要截取PATH变量中从第二个路径开始到结束的所有内容,可以使用如下的方法:
echo $PATH | cut -d ':' -f 2-
如果需要截取内容从开始到第3部分的内容,则可以使用如下的命令:
echo $PATH | cut -d ‘:’ -f –3
如果是截取从第2部分到第3部分的内容,则可以使用如下的命令:
echo $PATH | cut -d ':' 2-3
如果碰到一样是不包含任何分隔符的,那么实际上这一样我们可能不需要任何处理,cut默认是会原样输出的,如果你不需要它们输出,
则可以使用选项’-s’来阻止那些不包含指定分隔符的行:
echo $PATH | cut -s -d ':' -f 3
上述的-d选项可以用于有明显的分隔符存在的情况下使用,在格式明显的文本行处理中可以方便的对行进行截取。除了利用分隔符来截取分隔文本,对于没有分隔格式的字符文本还可以进行指定字符个数的截取,那就是-c选项了:
取出一行文本中的第3个字节:
echo 'hello' | cut -c 3
同样的,如果需要输出指定范围内的字符,则可以使用n-m的方式指定范围
echo 'hello' | cut -c -2 #输出行开始到第2个字符的内容 echo 'hello' | cut -c 2-3 #输出第2到3个字符 echo 'hello' | cut -c 2- #输出从第二字符开始到行结束的内容
在输出的时候,如果需要指定一种另外的分隔符来分隔输出的内容,以替代原来的分隔符,则可以使用--output-delimiter来处理
echo $PATH | cut -d ':' -f 1- --output-delimiter='*'
则输出的PATH变量就是以*作为分隔符,而不是使用:来作为分隔符,是不是很方便?
当cut遇上Vim
想象一下,如果cut命令和Vim配合使用,是不是可以完成很多霸气的操作呢,嘻嘻!且看:
假设我在Vim中正在编辑这样的文本:
我想把分隔数字的*改成冒号:,怎么办呢?一个一个改?,你或许会想到在Vim下的模式替换来处理,这确实是一个好方法。如果Vim结合cut命令来处理,也可以达到异曲同工的效果:
使用Vim下的模式替换命令:
Shift+V #选中当前的行 :s/\*/:/g #使用s命令进行替换,由于*在Vim中是由特殊含义的,需要使用反斜杠来转义
使用cut命令来处理:
Shift+V #选中光标所在的行 :!cut -d '*' -f 1- --output-delimiter=':'
两个命令的执行结果都一样,变成这样了:
所以,cut命令配合Vim,也可以是一种有效的文本编辑的方法。这不也是Unix下的KISS模式的一种体现吗?