cut使用举例

简单的cut举例

cut最简单的使用方法是结合-d-f

cut -d':' -f1 /etc/passwd

则可以截取出用户帐号

如果要截取多个字段,则可以类似使用如下案例

grep "/bin/bash" /etc/passwd | cut -d':' -f1,6

获取字符串部分字符

command | cut -c1-8

切出命令输出的前8个字符

Grabbing the first [x] characters for a string from a pipe

另外也有一些方法只获得前8个字符:

command | head -c8

command | awk '{print substr($0,1,8);exit}' 

command | sed 's/^\(........\).*/\1/;q'

如果是bash,还可以:

var=$(command)
echo ${var:0:8}

分隔(delimiter)符使用tabcut方法

如果字段之间是使用TAB来分隔的,有以下两种方法使用cut

  • 按下Ctrl-v + Tab

cut -f2 -d'   ' infile
  • 或者

cut -f2 -d$'\t' infile

BUT,其实cut默认的分隔符就是TAB,也就是不需要使用-d也可以啦!

多个(任意数量)空格的分隔使用cut方法

  • 使用sed来合并多个空格成一个空格

在使用cut工具来截取ps出来的进程的pid,会遇到一个问题,就是每列之间的空格数量是不一定的,这样虽然可以通过awk来截取,但是蹪于cut命令就不行了。解决的方法是将多个空格合并成一个空格,sed命令提供了这个功能:

ps axu | grep '[j]boss' | sed 's/\s\+/ /g' | cut -d' ' -f2

这里使用的是GNU sed,这个sed提供了\s表示空格(扩展),\+表示多个空格

或者

ps axu | grep '[j]boss' | sed 's/\s\s*/ /g' | cut -d' ' -f2

不过,在OS X中,需要传递-E参数来激活sed扩展正则表达式,然后使用[[:space:]]来代替\s,也就是

ps axu | grep '[j]boss' | sed -E 's/[[:space:]]+/ /g' | cut -d' ' -f2
  • 使用tr -s ' '来合并多个空格成为一个空格(这个方法最简单)

ps axu | grep '[j]boss' | tr -s ' ' | cut -d' ' -f2

tr命令-s表示压缩重复的意思(squeeze repeats),可以将多个重复字符压缩成单个字符,非常有用!

参考

Last updated