使用 Linux 文本工具简化数据的提取(4)实例1
- UID
- 1066743
|
使用 Linux 文本工具简化数据的提取(4)实例1
grep 工具:一个真实的例子grep 系列工具可以用于任何文本格式的系统文件,以便查找某行中的匹配项。例如,要在 /etc/passwd 文件中查找用户 “root” 的项,可以使用下面的命令:
1
2
3
| # grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0perator:/root:/sbin/nologin
|
由于 grep 会查找这个文件中的某个匹配项,因此这个命令会查找到 “root” 和 “operator” 这两项。如果我们希望只查找用户名为 “root” 的项,可以将这个命令修改成下面的样子:
1
2
| # grep "^root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
|
cut使用 cut 工具,我们可以将构成文件中数据域的各个列分隔开来。默认的分隔符是制表符,-f 选项可以用来指定希望显示的域。
举例来说,假设一个文本文件 “sample” 有三列,其内容如下所示:
1
2
3
4
| one two three
four five six
seven eight nine
ten eleven twelve
|
现在执行下面的命令:
这会返回:
1
2
3
4
| two
five
eight
eleven
|
如果将这个命令修改成:
这会返回下面的不同结果:
1
2
3
4
| one three
four six
seven nine
ten twelve
|
这个命令有几个命令行选项。除了 -f 之外,我们还应该熟悉下面两个选项:
- -c —— 允许我们指定字符而不是域。
- -d —— 允许我们指定其他分隔符,而不是制表符。
cut:两个实际例子ls -l 命令可以显示某个目录中所有文件的权限、链接个数、属主、组、大小、日期和文件名 —— 这些都是以空格分隔开的。如果我们对大部分域都不感兴趣,而是只希望了解文件属主的信息,可以使用下面的命令:
1
2
3
4
5
6
7
8
9
| # ls -l | cut -d" " -f5
root
562
root
root
root
root
root
root
|
这个命令只会显示文件属主(第 5 个域),而会忽略其他域。
如果您知道文件属主信息开始的第一个字符的确切位置,可以使用 -c 选项来显示文件属主的第一个字符。假设它是从第 16 个字符开始的,下面这个命令就返回第 16 个字符,这是文件属主名的第一个字符。
1
2
3
4
5
6
7
8
9
| # ls -l | cut -c16
r
r
r
r
r
r
r
|
如果我们再假设大部分用户都使用最多 8 个字符作为自己的用户名,那么我们就可以使用下面的命令:
这会返回用户名域的那些项。
现在假设文件名是从第 55 个字符开始的,但是我们无法确定文件名会连续占用多少个字符,因为有些文件名可能会比其他文件名长很多。解决方案是从第 55 个字符开始,但却不指定结束字符(这意味着我们要截取该行中所有剩余的内容),如下所示:
1
2
3
4
5
6
7
8
9
| # ls -l | cut -c55-
a.out
cscope-15.5
cscope-15.5.tar
cscope.out
memo
search_items
test.c
test.s
|
现在我们来考虑另外一种情况。为了获得系统中所有用户的清单,我们可以从前面使用过的 /etc/passwd 文件中提取第一个域:
1
2
3
4
5
6
7
8
9
10
11
12
13
| # cut -d":" -f1 /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
|
要搜集用户名及其对应的主目录,我们可以提取第 1 个和第 6 个域的内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
| # 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
|
pastepaste 工具可以对文件中的域进行合并。它从每个源文件中提取一行内容,并将其与另外一个源文件中的一行内容合并在一起。
举例来说,假设文件 “fileone” 的内容如下所示:
1
2
3
| IBM
Global
Services
|
另外,我们还有一个 “filetwo” 文件,其内容如下所示:
1
2
3
| United States
United Kingdom
India
|
下面的命令将这两个文件的内容合并在一起,如下所示:
1
2
3
4
| # paste fileone filetwo
IBM United States
Global United Kingdom
Services India
|
如果 fileone 中的行数比 filetwo 多,那么 paste 操作依然会继续,不过在制表符后面是一些空项。
制表符字符是默认的分隔符,但是我们可以使用 -d 选项将其修改成任何其他值。
1
2
3
4
| # paste -d", " fileone filetwo
IBM, United States
Global, United Kingdom
Services, India
|
我们也可以使用 -s 选项将 fileone 的内容在一行中输出,后面加上一个回车键,然后再显示 filetwo 的内容。
1
2
3
| # paste -s fileone filetwo
IBM Global Services
United States United Kingdom India
|
|
|
|
|
|
|