使用 Linux 文本工具简化数据的提取

href="http://purl.org/DC/elements/1.0/" rel="schema.DC" /> href="http://www.ibm.com/favicon.ico" rel="SHORTCUT ICON" /> media="screen,print" href="//www.ibm.com/common/v14/table.css" type="text/css" rel="stylesheet" /><script language="JavaScript" src="/developerworks/cn/js/dwcss14.js" type="text/javascript"></script> href="//www.ibm.com/common/v14/main.css" type="text/css" rel="stylesheet" /> media="all" href="//www.ibm.com/common/v14/cn/zh/screen.css" type="text/css" rel="stylesheet" /> media="print" href="//www.ibm.com/common/v14/cn/zh/print.css" type="text/css" rel="stylesheet" /><script language="JavaScript" src="//www.ibm.com/common/v14/cn/zh/detection.js" type="text/javascript"></script><script language="JavaScript" src="/developerworks/js/dropdown.js" type="text/javascript"></script><script language="JavaScript" src="/developerworks/email/grabtitle.js" type="text/javascript"></script><script language="JavaScript" src="/developerworks/email/emailfriend2.js" type="text/javascript"></script> <script language="javascript" src="/developerworks/js/ajax1.js" type="text/javascript"></script><script language="javascript" src="/developerworks/js/searchcount.js" type="text/javascript"></script> <script language="JavaScript" type="text/javascript">var emailAbstract = "很多 Linux 系统管理员都需要做一些整理纯文本配置文件的乏味工作。幸运的是,Linux 有很多源自于 UNIX 的数据提取工具,包括 head、tail、grep、egrep、fgrep、cut、paste、join、awk 等。本文给出了几个真实的例子,它们可以展示如何使用这些简单的命令行工具更好地服务于系统管理工作。本文将逐一介绍这些数据提取工具及其操作,将它们应用到日常工作所使用的典型文件中,并介绍一下为什么这些工具对于从这些文件中提取数据来说非常重要。"; </script>
IBM®
Skip to main content
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案    支持与下载    个性化服务    
skip to main content

developerWorks 中国  >  Linux  >

使用 Linux 文本工具简化数据的提取

最经常使用的命令行文本工具概述

developerWorks
文档选项

最新推荐

Java 应用开发源动力 - 下载免费软件,快速启动开发


级别: 初级

Harsha S. Adiga (haradiga@in.ibm.com), 软件工程师, IBM

2006 年 9 月 21 日

很多 Linux® 系统管理员都需要做一些整理纯文本配置文件的乏味工作。幸运的是,Linux 有很多源自于 UNIX® 的数据提取工具,包括 head、tail、grep、egrep、fgrep、cut、paste、join、awk 等。本文给出了几个真实的例子,它们可以展示如何使用这些简单的命令行工具更好地服务于系统管理工作。本文将逐一介绍这些数据提取工具及其操作,将它们应用到日常工作所使用的典型文件中,并介绍一下为什么这些工具对于从这些文件中提取数据来说非常重要。

Linux 操作系统中有很多文件:配置文件、文本文件、文档文件、日志文件、用户文件,这个清单还在不断增长。通常,这些文件都包含了要查找重要数据所需要访问的一些信息。尽管我们可以简单地使用诸如 cat、more 之类的标准工具将大部分文件的内容输出到屏幕上,但是系统中有更加合适的工具可以对文本进行过滤和处理,这样就可以只关心我们想要的内容。

在阅读本文的过程中,您可以打开 shell 并体验一下每个工具的例子。

正则表达式

在开始之前,我们需要首先理解什么是正则表达式,以及如何使用正则表达式。

在最简单的形式中,正则表达式(regular expression)是用来在文件中定位文本的一些搜索标准。例如,要查找所有包含单词 “admin” 的行,我们就可以对 “admin” 进行搜索。因此,“admin” 就构成了一个正则表达式。如果我们不但希望查找 “admin”,而且还想将其替换成 “root”,那么我们就可以在一个工具中使用适当的命令将 “admin” 替换成 “root”。它们都构成了正则表达式。

正则表达式所采用的一些基本规则如下:

  • 任何单个字符或一串字符都可以匹配字符本身,例如上面的 “admin” 的例子。

  • ^ 符号(^)表示一行的开始;$ 符号($)表示一行的结束。

  • 要搜索特殊字符(例如 $ 符号),需要在这些字符前面加上反斜线(/)。例如, /$ 就表示查找 $,而不是一行的末尾。

  • 点(.)代表任何单个字符。例如,ad..n 代表 5 个字符项,前两个字符是 “ad”,最后一个字符是 “n”。中间两个字符可以是任何字符,但是只能是由两个字符组成。

  • 任何时候如果正则表达式包含在斜线中(例如 /re/),搜索就是通过文件顺序进行的。如果正则表达式包含在问号中(例如,?re?),搜索就是通过文件逆序进行的。

  • 方括号([])表示多个值,减号(-)表示值的范围。例如,[0-9][0123456789] 相同,[a-z] 就等效于搜索任何小写字符。如果一个列表的首字符是 ^ 符号,它就匹配不在这个清单中的任何字符。

表 1 给出了这些规则是如何真正进行匹配的。

表 1. 示例正则表达式
例子说明
[abc]匹配 “a”、“b”、“c” 之一
[a-z]匹配从 “a” 到 “z” 的任何一个小写字符
[A-Z]匹配从 “A” 到 “Z” 的任何一个大写字符
[0-9]匹配从 0 到 9 的任何一个数字
[^0-9]匹配任何除了 0 到 9 数字范围内的任何字符
[-0-9]匹配从 0 到 9 的任何数字,或者是短横线(-)
[0-9-]匹配从 0 到 9 的任何数字,或者是短横线(-)
[^-0-9]匹配除从 0 到 9 的数字和短横线(-)之外的任何字符
[a-zA-Z0-9]匹配任何字符或数字

了解了这些信息,下面让我们开始看一下相关工具。





回页首


grep

grep 工具的工作方式是对文件的每一行搜索给定字符串的首次出现。如果找到了这个字符串,就打印该行的内容;否则就不对该行进行打印。下面这个文件我称之为 “memo”,阐述了 grep 的用法和结果。

To: All Employees

From: Human Resources

In order to better serve the needs of our mass market customers, ABC Publishing is integrating the groups selling to this channel for ABC General Reference and ABC Computer Publishing. This change will allow us to better coordinate our selling and marketing efforts, as well as simplify ABC's relationships with these customers in the areas of customer service, co-op management, and credit and collection. Two national account managers, Ricky Ponting and Greeme Smith, have joined the sales team as a result of these changes.

To achieve this goal, we have also organized the new mass sales group into three distinct teams reporting to our current sales directors, Stephen Fleming and Boris Baker. I have outlined below the national account managers and their respective accounts in each of the teams. We have also hired two new national account managers and a new sales administrator to complete our account coverage. They include:

Sachin Tendulkar, who joins us from XYZ Consumer Electronics as a national account manager covering traditional mass merchants.

Brian Lara, who comes to us via PQR Company and will be responsible for managing our West Coast territory.

Shane Warne, who will become an account administrator for our warehouse clubs business and joins us from DEF division.

Effectively, we have seven new faces on board:

1. RICKY PONTING
2. GREEME SMITH
3. STEPHEN FLEMING
4. BORIS BAKER
5. SACHIN TENDULKAR
6. BRIAN LARA
7. SHANE WARNE

Please join me in welcoming each of our new team members.

举一个简单的例子来说,要查找包含 “welcoming” 单词的行,最好的方法是使用下面的命令行:

# grep welcoming memo
Please join me in welcoming each of our new team members.

如果您想查找单词 “market”,结果会有很大的不同,如下所示:

# grep market memo
In order to better serve the needs of our mass
market customers, ABC Publishing is
integrating the groups selling to this channel
for ABC General Reference and ABC Computer
Publishing. This change will allow us to
better coordinate our selling and marketing
efforts, as well as simplify ABC's
relationships with these customers in the
areas of customer service, co-op management,
and credit and collection. Two national
account managers, Ricky Ponting and Greeme
Smith, have joined the sales team as a result
of these changes.

注意我们找到了两个匹配项:我们希望找的 “market” 和 “marketing”。如果在这个文件中还存在 “marketable” 或 “marketed” 之类的单词,那么上面的命令也会显示包含这些单词的行的内容。

在 grep 中可以使用通配符和元字符,我强烈建议将它们放到引号中,这样 shell 就不会将它们解释成命令了。

要查找所有包含数字的行,请使用下面的命令:

# grep  "[0-9]" memo
1. RICKY PONTING
2. GREEME SMITH
3. STEPHEN FLEMING
4. BORIS BAKER
5. SACHIN TENDULKAR
6. BRIAN LARA
7. SHANE WARNE

要查找所有包含 “the” 的行,请使用下面的命令:

# grep the memo
In order to better serve the needs of our mass
market customers, ABC Publishing is
integrating the groups selling to this channel
for ABC General Reference and ABC Computer
Publishing. This change will allow us to
better coordinate our selling and marketing
efforts, as well as simplify ABC's
relationships with these customers in the
areas of customer service, co-op management,
and credit and collection. Two national
account managers, Ricky Ponting and Greeme
Smith, have joined the sales team as a result
of these changes.

To achieve this goal, we have also organized
the new mass sales group into three distinct
teams reporting to our current sales
directors, Stephen Flemming and Boris Baker. I
have outlined below the national account
managers and their respective accounts in each
of the teams. We have also hired two new
national account managers and a new sales
administrator to complete our account
coverage. They include:

正如您可能已经注意到的一样,输出结果中包含了单词 “these”,还有单词 “the” 的一些精确匹配。

grep 工具,与很多其他 UNIX/Linux 工具一样,都是大小写敏感的,这意味着查找 “The” 和 “the” 会产生完全不同的结果。

# grep The memo
To achieve this goal, we have also organized
the new mass sales group into three distinct
teams reporting to our current sales
directors, Stephen Flemming and Boris Baker. I
have outlined below the national account
managers and their respective accounts in each
of the teams. We have also hired two new
national account managers and a new sales
administrator to complete our account
coverage. They include:

如果您想查找一个特定的单词或短语,但却不太关心它们的大小写,那可以使用两种方法。第一种方法是使用方括号同时查找 “The” 和 “the”,如下所示:

# grep "[T, t]he" memo
In order to better serve the needs of our mass
market customers, ABC Publishing is
integrating the groups selling to this channel
for ABC General Reference and ABC Computer
Publishing. This change will allow us to
better coordinate our selling and marketing
efforts, as well as simplify ABC's
relationships with these customers in the
areas of customer service, co-op management,
and credit and collection. Two national
account managers, Ricky Ponting and Greeme
Smith, have joined the sales team as a result
of these changes.

To achieve this goal, we have also organized
the new mass sales group into three distinct
teams reporting to our current sales
directors, Stephen Flemming and Boris Baker. I
have outlined below the national account
managers and their respective accounts in each
of the teams. We have also hired two new
national account managers and a new sales
administrator to complete our account
coverage. They include:

第二种方法是使用 -i 选项,这告诉 grep 忽略大小写的敏感性。

# grep -i the memo
In order to better serve the needs of our mass
market customers, ABC Publishing is
integrating the groups selling to this channel
for ABC General Reference and ABC Computer
Publishing. This change will allow us to
better coordinate our selling and marketing
efforts, as well as simplify ABC's
relationships with these customers in the
areas of customer service, co-op management,
and credit and collection. Two national
account managers, Ricky Ponting and Greeme
Smith, have joined the sales team as a result
of these changes.

To achieve this goal, we have also organized
the new mass sales group into three distinct
teams reporting to our current sales
directors, Stephen Flemming and Boris Baker. I
have outlined below the national account
managers and their respective accounts in each
of the teams. We have also hired two new
national account managers and a new sales
administrator to complete our account
coverage. They include:

除了 -i 选项之外,还有另外几个命令行选项可以用来改变 grep 的输出结果。最常见的选项如下所示:

  • -c —— 屏蔽正常输出;相反,打印每个输入文件的匹配行数。
  • -l —— 屏蔽正常输出;相反,打印包含正常输出内容的每个输入文件的名字。
  • -n —— 在每行输出前面加上该行在输入文件中的行号作为前缀。
  • -v —— 将匹配意义进行逆反 —— 即选择那些 匹配搜索条件的行。




回页首


fgrep

fgrep 会对文件搜索某个字符串,并打印包含这个字符串的所有行的内容。与 grep 不同的是,fgrep 搜索的是一个字符串,而不是可以匹配某个表达式的一种模式。fgrep 可以看作是 grep 在以下方面进行了增强:

  • 一次可以搜索多个对象。
  • fgrep 工具通常速度都比 grep 更快。
  • 我们不能使用 fgrep 来搜索使用模式的正则表达式。

假设我们希望从前面的 memo 文件中提取全部由大写字母组成的名字。为了查找 “STEPHEN” 和 “BRIAN”,我们需要执行两个单独的 grep 命令,如下所示:

# grep STEPHEN memo
3. STEPHEN FLEMING

# grep BRIAN memo
6. BRIAN LARA

使用 fgrep,只需要一个命令就可以实现相同的任务:

# fgrep "STEPHEN
> BRIAN" memo
3. STEPHEN FLEMING
6. BRIAN LARA

注意在这两项之间需要使用回车符号。如果没有这个回车符号,搜索就变成了查找一行中的 “STEPHEN BRIAN”。有了这个回车符号之后,它就会查找 “STEPHEN” 的匹配项,以及匹配 “BRIAN” 的项。

还要注意在目标文本两侧必须要放上引号。这样可以将文本与文件名区分开来。

除了在命令行上指定搜索项之外,我们也可以将它们放到一个文件中,并使用这个文件的内容来搜索其他文件。-f 选项让我们可以指定一个包含搜索项的主文件,其中可以列出经常搜索的内容。

举例来说,我们可以想像一个名为 “search_items” 的文件,其中包含了我们希望搜索的两项内容:

# cat search_items
STEPHEN
BRIAN

下面的命令在前面的 memo 文件中搜索 “STEPHEN” 和 “BRIAN”:

# fgrep -f search_items memo
3. STEPHEN FLEMING
6. BRIAN LARA





回页首


egrep

egrep 是 grep 的一个功能更加强大的版本,它让我们可以一次搜索多个对象。要搜索的对象是使用回车符(与 fgrep 一样)或管道符(|)来分隔的。

# egrep "STEPHEN
> BRIAN" memo
3. STEPHEN FLEMING
6. BRIAN LARA

# egrep "STEPHEN | BRIAN" memo
3. STEPHEN FLEMING
6. BRIAN LARA

上面这两个命令都可以完成相同的工作。

除了搜索多个目标的功能之外,egrep 还提供了重复搜索和分组搜索的功能:

  • ? 查找问号前面字符的零次匹配或一次匹配。
  • + 查找加号前面字符的一次或多次匹配。
  • ( ) 表示一个分组。

例如,假设您不记得 Brian 的姓是 “Lara” 还是 “Laras”。

# egrep "LARAS?" memo
6. BRIAN LARA

这次搜索会输出同时匹配 “LARA” 和 “LARAS” 的项。下面的搜索稍微有些不同:

# egrep "STEPHEN+" memo
3. STEPHEN FLEMING

它可以与 “STEPHEN”、“STEPHENN”、“STEPHENNN” 等匹配。

如果您正在查找一个单词加上它的一个派生词,可以在圆括号中包含派生词的标志字符。

# egrep -i "electron(ic)?s" memo
Sachin Tendulkar, who joins us from XYZ Consumer
Electronics as a national account manager covering
traditional mass merchants.

这会查找可以匹配 “electrons” 的项和可以匹配 “electronics” 的项。

总结一下:

  • + 号后面的正则表达式可以匹配这个正则表达式的一次或多次出现。

  • ? 号后面的正则表达式可以匹配这个正则表达式的零次或一次出现。

  • 使用 | 符号或回车符分隔开的正则表达式会返回可以与任意一个表达式匹配的字符串。

  • 正则表达式可以放到圆括号 ( ) 中进行分组。

  • 我们可以使用的命令行参数包括 -c-f-i-l-n-v




回页首


grep 工具:一个真实的例子

grep 系列工具可以用于任何文本格式的系统文件,以便查找某行中的匹配项。例如,要在 /etc/passwd 文件中查找用户 “root” 的项,可以使用下面的命令:

# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

由于 grep 会查找这个文件中的某个匹配项,因此这个命令会查找到 “root” 和 “operator” 这两项。如果我们希望只查找用户名为 “root” 的项,可以将这个命令修改成下面的样子:

# grep "^root" /etc/passwd
root:x:0:0:root:/root:/bin/bash





回页首


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





回页首


paste

paste 工具可以对文件中的域进行合并。它从每个源文件中提取一行内容,并将其与另外一个源文件中的一行内容合并在一起。

举例来说,假设文件 “fileone” 的内容如下所示:

IBM
Global
Services

另外,我们还有一个 “filetwo” 文件,其内容如下所示:

United States
United Kingdom
India

下面的命令将这两个文件的内容合并在一起,如下所示:

# paste fileone filetwo
IBM       United States
Global    United Kingdom
Services  India

如果 fileone 中的行数比 filetwo 多,那么 paste 操作依然会继续,不过在制表符后面是一些空项。

制表符字符是默认的分隔符,但是我们可以使用 -d 选项将其修改成任何其他值。

# paste -d", " fileone filetwo
IBM, United States
Global, United Kingdom
Services, India

我们也可以使用 -s 选项将 fileone 的内容在一行中输出,后面加上一个回车键,然后再显示 filetwo 的内容。

# paste -s fileone filetwo
IBM           Global            Services
United States United Kingdom    India





回页首


join

joinpaste 的一个很好的增强版本。join 只有在所要连接的文件共享某个共同的域时才会工作。

举例来说,考虑我们上面介绍 paste 时所使用的两个文件。下面是在使用 join 对其进行合并时所发生的事情:

# join fileone filetwo

注意这并没有显示任何东西。join 工具必须要在所操作的文件之间找到共同的域,默认情况下,它期望这个共同的域就是第一个域。

要了解这是如何工作的,我们可以尝试添加一些新内容。假设 fileone 现在包含以下内容:

aaaa    Jurassic Park
bbbb    AI
cccc    The Ring
dddd    The Mummy
eeee    Titanic

filetwo 现在包含以下内容:

aaaa    Neil    1111
bbbb    Steven  2222
cccc    Naomi   3333
dddd    Brendan 4444
eeee    Kate    5555

现在,再次尝试下面的命令:

# join fileone filetwo
aaaa    Jurassic Park    Neil    1111
bbbb    AI               Steven  2222
cccc    The Ring         Naomi   3333
dddd    The Mummy        Brendan 4444
eeee    Titanic          Kate    5555

此时第一个域相同的地方就会被识别出来,匹配项也就进行了合并。paste 是盲目地从每个文件中提取内容并创建输出结果;而 join 则是只合并那些匹配的行,这种匹配必须非常精确。举例来说,假设您向 filetwo 文件中添加一行内容:

aaaa    Neil    1111
bbbb    Steven  2222
ffff    Elisha  6666
cccc    Naomi   3333
dddd    Brendan 4444
eeee    Kate    5555

现在这个命令只会产生下面的输出结果了:

# join fileone filetwo
aaaa    Jurassic Park   Neil     1111
bbbb    AI              Steven   2222

只要这两个文件不再匹配了,就不会再执行任何操作了。第一个文件的每一行都匹配且只匹配于第二个文件相同行的默认域。如果找到匹配项,它们就会组成输出;否则就不再执行任何操作了。

默认情况下,join 只会查找第一个域进行匹配,并输出所有列的内容;不过我们可以对这种行为进行修改。-1 选项让我们可以指定使用哪个域作为 fileone 中的匹配项, -2 选项让我们可以指定使用哪个域作为 filetwo 中的匹配项。

举例来说,要对 fileone 的第二个域和 filetwo 的第三个域进行匹配,我们可以使用下面的语法:

# join -1 2 -2 3 fileone filetwo

-o 选项可以以 {file.field} 格式来指定输出结果。因此,要在匹配行上打印 fileone 的第二个域和 filetwo 的第三个域,语法为:

# join -o 1.2 -o 2.3 fileone filetwo





回页首


join:一个实际的例子

在实践中可以使用 join 工具最明显的方法是从 /etc/passwd 中提取用户名和对应的主目录项,并从 /etc/group 文件中提取组名。组名在 /etc/passwd 文件中是以数字的格式出现在第四个域中的。类似地,它们在 /etc/group 文件中是在第三个域中出现的。

# join -1 4 -2 3 -o 1.1 -o 2.1 -o 1.6 -t":" /etc/passwd /etc/group
root:root:/root
bin:bin:/bin
daemon:daemon:/sbin
adm:adm:/var/adm
lp:lp:/var/spool/lpd
nobody:nobody:/
vcsa:vcsa:/dev
rpm:rpm:/var/lib/rpm
nscd:nscd:/
ident:ident:/home/ident
netdump:netdump:/var/crash
sshd:sshd:/var/empty/sshd
rpc:rpc:/





回页首


awk

awk 是 Linux 上功能最为强大的工具之一。它本身实际上是一种编程语言,可以实现复杂的逻辑语句,还可以简化部分文本的提取。在本文那中我们将不会详细对其进行介绍,而是快速了解一下它的语法,并尝试几个实际的例子。

awk 命令包括一个模式和由一条或多条语句构成的操作,语法如下所示:

awk '/pattern/ {action}' file

请注意:

  • awk 测试指定文件中的每个记录是否符合模式匹配。如果找到匹配项,就执行指定的操作。
  • awk 可以在管道中作为过滤器,如果没有指定文件,它也可以从键盘(标准输入)中接收输入。

一种非常有用的操作是打印数据!下面是如何引用一条记录中的域。

  • $0 —— 整条记录
  • $1 —— 该记录中的第一个域
  • $2 —— 该记录中的第二个域

我们还可以从一条记录中提取多个域,之间使用逗号分开。

举例来说,要提取 /etc/passwd 文件中的第 6 个域,命令如下:

# awk -F: '{print $6}' /etc/passwd
/root
/bin
/sbin
/var/adm
/var/spool/lpd
/sbin
/sbin
/sbin
/var/spool/mail
/etc/news
/var/spool/uucp

注意 -F 是由预先定义的 FS 变量所定义的输入域分隔符。在我们这个例子中是空格。

要从 /etc/passwd 文件中提取第一个和第六个域,命令如下:

# awk -F: '{print $1,$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

要在域之间使用短横线代替冒号来打印这个文件的内容,命令如下:

# awk -F: '{OFS="-"}{print $1,$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

要使用短横线作为域之间的分隔符来打印文件,并且只以逆序打印第一个域和第六个域,命令如下:

# awk -F: '{OFS="-"}{print $6,$1}' /etc/passwd
/root-root
/bin-bin
/sbin-daemon
/var/adm-adm
/var/spool/lpd-lp
/sbin-sync
/sbin-shutdown
/sbin-halt
/var/spool/mail-mail
/etc/news-news
/var/spool/uucp-uucp
/root-operator





回页首


head

head 工具打印每个文件的最开始部分的内容(默认是 10 行)。如果没有给定文件,它就从标准输入中读入内容,如果给定了文件名就从文件中读入内容。

举例来说,如果我们希望从 memo 文件中提取前两行内容,命令如下:

# head -2 memo
In order to better serve the needs of our mass
market customers, ABC Publishing is
integrating the groups selling to this channel
for ABC General Reference and ABC Computer
Publishing. This change will allow us to
better coordinate our selling and marketing
efforts, as well as simplify ABC's
relationships with these customers in the
areas of customer service, co-op management,
and credit and collection. Two national
account managers, Ricky Ponting and Greeme
Smith, have joined the sales team as a result
of these changes.

我们可以使用 -c 选项指定要显示的字节个数。举例来说,如果我们希望从 memo 文件中读取前两个字节的内容,可以使用下面的命令:

# head -c 2 memo
In





回页首


tail

tail 工具打印每个文件的最末尾部分的内容(默认是 10 行)。如果没有给定文件,它就从标准输入中读入内容,如果给定了文件名就从文件中读入内容。

举例来说,如果我们希望从 memo 文件中提取最后两行内容,命令如下:

# tail -2 memo

Please join me in welcoming each of our new team members.

我们可以使用 -c 选项指定要显示的字节个数。举例来说,如果我们希望从 memo 文件中读取最后五个字节的内容,可以使用下面的命令:

# tail -c 5 memo
ers.





回页首


结束语

现在我们已经知道如何使用各种工具从标准 Linux 文件中向外提取数据了。一旦提取出数据之后,这些数据就可以进行查看、打印或重定向到其他文件或数据库中了。了解了如何使用这些有用的工具可以帮助我们减少花费在烦杂任务上的时间,从而能够成为一名效率更高的管理员。





回页首


参考资料

学习

获得产品和技术
  • 订购免费的 SEK for Linux,这有两张 DVD,包括最新的 IBM for Linux 的试用软件,包括 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere®。

  • 在您的下一个开发项目中采用 IBM 试用软件,这可以从 developerWorks 上直接下载。


讨论




回页首


关于作者

 

Harsha Adiga 就职于印度的 IBM Software Group,他参与了很多 Linux 和开放源码社区、工作组的工作。他的主要兴趣包括 Linux 和 Unix 内幕、移植、编译器和代码优化。他在 Linux 和 Unix 平台上从事软件开发和测试工作已经有超过 6 年的时间了。






回页首


对本文的评价

<script language="javascript">document.write(' ');</script>
太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?




回页首


IBM、DB2、Lotus、Rational、Tivoli 和 WebSphere 是 IBM 公司在美国和/或其他国家的商标。 Linux 是 Linus Torvalds 在美国和/或其他国家的商标。 Unix 是 The Open Group 在美国和/或其他国家的商标。 其他公司、产品或服务的名称可能是其他公司的商标或服务标志。


    关于 IBM隐私条约联系 IBM
<script type="text/javascript" language="JavaScript1.2" src="//www.ibm.com/common/stats/stats.js"></script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值