首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Linux 文本工具简化数据的提取(4)实例1

使用 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
# cut -f2 sample




这会返回:
1
2
3
4
two
five
eight
eleven




如果将这个命令修改成:
1
# cut -f1, 3 sample




这会返回下面的不同结果:
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 个字符作为自己的用户名,那么我们就可以使用下面的命令:
1
# ls -l | cut -c16-24




这会返回用户名域的那些项。
现在假设文件名是从第 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

返回列表