20070612

根据分隔符按列cut(转载)

cut

使用 cut 工具,我们可以将构成文件中数据域的各个列分隔开来。默认的分隔符是制表符,-f 选项可以用来指定希望显示的域。

举例来说,假设一个文本文件 "sample" 有三列,其内容如下所示:

one    two    three
four five six
seven eight nine
ten eleven twelve

现在执行下面的命令:

# cut -f2 sample 

这会返回:

two
five
eight
eleven

如果将这个命令修改成:

# cut -f1, 3 sample 

这会返回下面的不同结果:

one    three
four six
seven nine
ten twelve

这个命令有几个命令行选项。除了 -f 之外,我们还应该熟悉下面两个选项:

  • -c ―― 允许我们指定字符而不是域。
  • -d ―― 允许我们指定其他分隔符,而不是制表符。
____________________________________

cut:两个实际例子

ls -l 命令可以显示某个目录中所有文件的权限、链接个数、属主、组、大小、日期和文件名 ―― 这些都是以空格分隔开的。如果我们对大部分域都不感兴趣,而是只希望了解文件属主的信息,可以使用下面的命令:

# ls -l | cut -d" " -f5
root
562
root
root
root
root
root
root

这个命令只会显示文件属主(第 5 个域),而会忽略其他域。

如果您知道文件属主信息开始的第一个字符的确切位置,可以使用 -c 选项来显示文件属主的第一个字符。假设它是从第 16 个字符开始的,下面这个命令就返回第 16 个字符,这是文件属主名的第一个字符。

# ls -l | cut -c16
r

r
r
r
r
r
r

如果我们再假设大部分用户都使用最多 8 个字符作为自己的用户名,那么我们就可以使用下面的命令:

# ls -l | cut -c16-24 

这会返回用户名域的那些项。

现在假设文件名是从第 55 个字符开始的,但是我们无法确定文件名会连续占用多少个字符,因为有些文件名可能会比其他文件名长很多。解决方案是从第 55 个字符开始,但却不指定结束字符(这意味着我们要截取该行中所有剩余的内容),如下所示:

# ls -l | cut -c55-
a.out
cscope-15.5
cscope-15.5.tar
cscope.out
memo
search_items
test.c
test.s

现在我们来考虑另外一种情况。为了获得系统中所有用户的清单,我们可以从前面使用过的 /etc/passwd 文件中提取第一个域:

# cut -d":" -f1 /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator

要搜集用户名及其对应的主目录,我们可以提取第 1 个和第 6 个域的内容:

# cut -d":" -f1,6 /etc/passwd
root:/root
bin:/bin
daemon:/sbin
adm:/var/adm
lp:/var/spool/lpd
sync:/sbin
shutdown:/sbin
halt:/sbin
mail:/var/spool/mail
news:/etc/news
uucp:/var/spool/uucp
operator:/root

1 comment:

Anonymous said...

Youг οwn post offers νerified helpful tο us.

It’s еxtremеly informatіve and уou're simply certainly very experienced in this region. You get exposed my personal eyes for you to varying opinion of this subject matter along with intriguing and solid written content.

my page: buy Klonopin online
Here is my web page Klonopin