了解对本教程的期望以及如何最大程度地利用本教程。
这个由四部分组成的教程系列从头开始涵盖UNIX®。 最初的教程对于那些远离UNIX操作系统已有一段时间的用户来说是一个很好的补充。 对于来自Windows®背景的全新UNIX用户,它也很有用,因为它使用对Windows的引用和比较。 第二个教程着重于vi
文本编辑器,它是最强大(也是最神秘的)UNIX实用程序之一。 本教程教您有关使用正则表达式(包括grep
, sed
和awk
的UNIX命令行过滤器的信息。
要释放UNIX命令行过滤器(如grep
, sed
和awk
背后的功能,需要对正则表达式有深入的了解。 本教程向新用户教授这些实用工具的功能以及如何使用正则表达式来操纵文本。 您将通过使用带有grep
简单,有趣的示例开始,然后进入sed
和awk
真实示例。
本教程的目的是使UNIX和Linux®用户熟悉三个功能强大的命令行工具,这些工具可用于快速有效地搜索和更改数据。 本教程的开头介绍了许多UNIX实用程序(和编程语言)的基本框架中使用的正则表达式。 以下各节提供了将正则表达式与grep
, sed
和awk
一起使用的示例。
您需要对本教程的命令行有基本的了解。 对于本教程的某些部分,了解如何在UNIX中使用stdin
, stdout
和pipe
处理输入和输出也很有帮助。
要完成本教程,只需要在运行任何类似UNIX的操作系统的任何计算机上访问用户帐户即可。 类似UNIX的操作系统包括IBMAIX®操作系统,Linux,Berkeley软件发行版(BSD),MacOS®X(使用终端机访问命令行)以及许多其他操作系统。
正则表达式是一个字符串,旨在搜索或替换另一个字符串。 乍一看,这似乎是一个非常基本的功能。 大多数用户几乎对每个图形文本编辑器或文字处理应用程序都熟悉简单的搜索和替换功能。 如果将此基本搜索和替换功能与计算器进行比较,则可以将正则表达式与成熟的计算机进行比较。 使用正则表达式作为搜索条件的功能不应被低估。
一些最强大的基于UNIX的命令行工具使用正则表达式,包括grep
, sed
和awk
(以及某些编程语言,包括Perl)。 学习如何使用正则表达式是从UNIX命令行的基本用户转变为真正的超级用户的必需步骤。 正则表达式语法有几种不同的版本, grep
, sed
和awk
多种版本,因此本教程重点介绍在每种实现中相当标准的最常见构造。 不要忘记参考系统的man
页以获取语法和命令行选项的详细信息。
在探索使用正则表达式的UNIX应用程序之前,重要的是要学习基础知识。 在本节中,请继续阅读。 稍后,您将在grep
尝试一些示例。
正则表达式使用正常字符的字符串以及指示搜索条件的特殊字符组合。 在最基本的情况下,根本不使用特殊字符。 例如,如果您只想使用术语“ golf
作为搜索条件,则键入以下内容:
golf
这是一个正则表达式! 它搜索单词golf
所有实例。 正则表达式区分大小写,因此此搜索将找到g olf
所有实例,但不会找到G olf
实例。
要同时搜索g olf
和G olf
,可以使用方括号(正则表达式中的特殊字符)并列出要搜索的单个字符的字符串。 这类似于搜索内的搜索(这是正则表达式背后的魔力)。
[Gg]olf
相同的概念适用于任何字符列表-不仅用于区分大小写。 例如,您可能要搜索golf
和gelf
,这是一项新的运动,它由您组成:
g[oe]lf
现在,假设您还有第三项运动gilf
,您也想检查一下。 一种使用到目前为止所学知识的方法是在搜索条件中使用o
, e
和i
。 但是随着搜索量的增长,您可能希望找到所有以g
开头和以lf
结尾且中间有一个字符的字符。 为此,请使用另一个特殊字符,即句点(。)。
g.lf
这将查找所有以g
开头并以lf
结尾且之间有一个字符的字符串。 要将搜索扩展到所有以g
开头和以f
结尾且中间有两个字符的字符串,可以使用两个句点:
g..f
现在,您已经对正则表达式背后的概念有了基本的了解,是时候开始使用实际示例了,以便您可以实际使用它们了。 您将尝试使用的第一个命令行应用程序是grep
。 grep
实际上是从正则表达式g/RE/p
获得其名称的。 grep
用于在一个或多个文件中搜索特定字符串的实例。 默认情况下, grep
输出您的搜索字符串出现的每一行(与搜索字符串本身相反)。 如果要搜索多个文件,则grep
还会输出找到该行的文件名。
使用以下文本创建一个名为grep.txt的文件:
I like golf. Golf is played on grass. I created gilf.
grep
的基本语法为:
grep REGULAREXPRESSION FILENAME(S)
现在,回到正则表达式的第一个示例: golf
一词本身。 要将此表达式与grep
,请输入:
grep golf grep.txt
此命令将搜索字符串的所有实例的grep.txt文件golf
,并输出包含该字符串的行。 您的输出应为:
I like golf.
接下来,尝试使用上面讨论的一些特殊字符。 您可以使用方括号(方括号表达式)表示您要搜索golf
和Golf
:
grep [gG]olf grep.txt
输出看起来像这样:
I like golf. Golf is played on grass.
要搜索golf
和gilf
,可以再次使用括号。 相反,尝试使用句点来表示您要搜索g
和lf
之间的任何字符:
$grep g.lf grep.txt
输出看起来像这样:
I like golf. I created gilf.
现在,您已经找到了获取每种golf
变化的方法,但是您的搜索都没有返回全部三个实例: golf
, Golf
和gilf
。 花点时间考虑一下如何搜索这三个。 有多种方法可以做到这一点。 这是几个例子:
grep ..lf grep.txt grep [gG][oi]lf grep.txt
两种方法都返回所有三行:
I like golf. Golf is played on grass. I created gilf.
您能想到其他方法吗? 到目前为止,您仅学习了在正则表达式中使用的两个特殊字符。 这仅仅是开始! 一些特殊字符在其他特殊字符内使用。 例如,当您将一组字符括在方括号中时,可以使用破折号(-)搜索一系列字符。 将以下行添加到您的文本文件:
What is g2lf?
到目前为止,您已经了解到,如果您使用g.lf
或g[oi2]lf
类的正则表达式,将在搜索结果中包含此行。 使用句点可返回结果,其中该位置有任何字符; 使用[oi2]
返回的结果仅是o
i
或2
在该位置。 您可以使用破折号来实现第三个方法,该方法包括多个字符,但不是每个字符:
grep g[a-z]lf
此方法产生以下输出:
I like golf. I created gilf.
从输出中可以看到,此方法搜索介于a
和z
之间a
任何字符(按字母顺序)。 这不包括数字或符号介于g
和lf
之间的字符串,这些字符串或符号不是真正的单词,并且可能不属于所需搜索条件。
您还可以通过在括号内包括其他字符集来搜索多个字符序列。 例如,要搜索az
和AZ
,请使用以下搜索:
grep g[a-zA-Z]lf
随着字符序列列表的增加,您可能会发现避免某些字符而不是指定要查找的字符会更容易搜索。 您可以通过在搜索序列之前(在方括号内)使用尖号(^)来完成此操作。 那是一个相当大的数目,但是通过遵循一个示例应该很容易理解。 更改搜索以避免使用数字,但使用此grep
命令可以包括所有其他字符:
grep g[^0-9]lf
此搜索类似于先前的搜索,该搜索找到了所有字母字符,但是该搜索还返回了不在字母中且不在数字序列中的字符,例如数字符号( #
)和美元符号( $
)。您排除了。
下一个要试验的特殊字符是星号(*),它是几个重复运算符之一。 大多数人都熟悉使用命令行上的星号作为文件名(通配符)的搜索条件,但是在正则表达式中使用星号却大不相同。 星号表示搜索项(前一个字符或方括号表达式)可以出现零次,一次或多次。 要尝试此操作,请将以下几行添加到您一直在使用的grep.txt文件中:
This time the o is missing in glf. Some people might say goolf. But they would not say goilf.
现在,整个文件应如下所示:
I like golf. Golf is played on grass. I created gilf. What is g2lf? This time the o is missing in glf. Some people might say goolf. But they would not say goilf.
尝试在golf
的o
后使用星号:
grep go*lf grep.txt
您的搜索返回包含单词golf
, glf
和goolf
:
I like golf. This time the o is missing in glf. Some people might say goolf.
另一个重复运算符是问号(?)。 问号的功能类似于星号,除了搜索项可以出现零或一次。 多次出现将不匹配。 尝试使用问号而不是星号来执行刚刚执行的搜索:
grep go?lf grep.txt
如您所见,这次将golf
和glf
作为匹配结果返回,但是goolf
并不是因为在问号之前有多个搜索项o
实例:
I like golf. This time the o is missing in glf.
通用重复运算符的最后一个是加号(+)。 当搜索项出现一次或多次时,将找到一个加号。 与星号不同,必须找到至少一个匹配项。 请尝试以下示例:
grep go+lf grep.txt
这次,搜索返回golf
和goolf
,但没有返回glf
因为未找到o
:
I like golf. Some people might say goolf.
在继续使用sed
之前要了解的最后一个特殊字符是:行首锚(使用插入符号实现)和行尾锚(使用美元符号实现)。 您可能还记得在本教程前面使用插入号来否定方括号表达式。 在支架之外使用插入号时,它会执行完全不同的功能。 将插入号放在正则表达式的开头可指示搜索仅在行的开头进行。 换句话说,正则表达式中的第一个字符(在插入号之后)必须与新行中的第一个字符匹配,搜索才能匹配该行。 同样,在正则表达式的末尾放置一个美元符号,以表示您只想返回与行尾匹配的结果。 换句话说,您的正则表达式中的最后一个字符(在美元符号之前)必须与行中的最后一个字符匹配,搜索才能与该行匹配。 要对此进行测试,请将以下两行添加到grep.txt中:
golf has been a fine example let's talk about something besides golf
请注意,你不应该大写或圈点golf
此测试,因为这将表明一个相同的单词在一行或使用锚线的开始结束操作不同的搜索。 要测试行首锚,请键入以下内容:
grep ^golf grep.txt
输出看起来像这样:
golf has been a fine example
要测试行尾锚,请使用相同的搜索,但要删除插入符号并在golf
之后添加一个美元符号。
grep golf$ grep.txt
使用行尾锚点的输出如下所示:
let's talk about something besides golf
现在,您已经通过在命令行上使用grep
学习了正则表达式的基础。 接下来,您将学习使用sed
,它不仅搜索文本,还将替换它。 首先,这是到目前为止所学知识的回顾:
. A period represents any single character [] Brackets enclose character sequences - A dash is used between characters to create a sequence (inside []) ^ A carrot is used to negate a sequence (inside []) * An asterisk searches for zero, one, or many instances of a search item ? A question mark searches for zero or one instance of a search item + A plus sign searches for one or many instances of a search item $ A dollar sign searches the end of a line ^ A carrot searches the beginning of a line \ A backslash preceding a special character makes it a plain character (See the next section.)
sed
是流编辑器的缩写。 文本编辑器的传统的现代定义是一个交互式应用程序,可用于创建和编辑文本文件。 sed
还是文本编辑器,但它是命令行实用程序,而不是交互式实用程序,这使其成为批处理编辑的极其强大的工具。 sed
通常在UNIX shell脚本中用于过滤大量文本文件。 在本教程的第一部分中,您使用了一个讨论高尔夫的小测试文件。 为了演示sed
编辑器的高级功能,您将使用一小段开发人员可能希望在批处理过程中更改的代码段。
复制此文本并将其粘贴到名为sed.txt的文件中:
system "echo 'project:$project' >> logfile"; system "echo 'version:$version' >> logfile"; system "echo 'optionalid:$optionalid' >> logfile"; system "echo 'nodes:$nodes' >> logfile"; system "echo 'threads:$threads' >> logfile";
前面解释过的所有与grep
一起使用的特殊字符也可以在sed
。 要使用sed
,您必须学习一些其他语法。 sed
的基本表达式由四部分组成,并用正斜杠(/)分隔。 这是基本sed
命令的常见语法:
sed s/REGULAREXPRESSION/REPLACEMENTSTRING/flags INPUT_FILE
s
表示您要执行搜索并替换 。 正斜杠用于绑定sed
正则表达式。 例如,如果您只想将logfile
替换为logfile.txt
,则可以运行以下命令:
sed s/logfile/logfile.txt/ sed.txt
输出看起来像这样:
system "echo 'project:$project' >> logfile.txt"; system "echo 'version:$version' >> logfile.txt"; system "echo 'optionalid:$optionalid' >> logfile.txt"; system "echo 'nodes:$nodes' >> logfile.txt"; system "echo 'threads:$threads' >> logfile.txt";
在这种情况下要注意的重要一点是sed
实际上不会更改sed.txt的内容。 而是将输出发送到标准输出。 对于这些示例,您将输出发送到标准输出,以便您可以立即查看操作结果。
为了将来参考,可以捕获输出或将其发送到新文件中。 例如,要将输出发送到sed_new.txt,请运行以下命令:
sed s/logfile/logfile.txt/ sed.txt > sed_new.txt
在学习斜杠时,还有另一个非常重要的特殊字符要学习。 反斜杠(\)称为转义字符,因为它从正则表达式解释中转义下一个字符。 更简单地讲,在特殊字符前加反斜杠可使该字符成为普通项目而不是命令项目。 这很重要,因为许多文件(尤其是在编写代码时)大量使用了用于执行正则表达式的相同字符。 在sed.txt文件中,您会注意到使用了美元符号。 如果要替换$project
而不是project
,则需要在搜索中使用转义符并替换:
sed s/\$project/\$project_name/ sed.txt
您可以在输出中看到$project
已更改,但project
并未更改。
system "echo 'project:$project_name' >> logfile"; system "echo 'version:$version' >> logfile"; system "echo 'optionalid:$optionalid' >> logfile"; system "echo 'nodes:$nodes' >> logfile"; system "echo 'threads:$threads' >> logfile";
这带来了sed
另一个重要功能。 如果要更改project
两个实例怎么办? 从到目前为止所学的知识来看,合理的答案是仅将project
用作正则表达式,但这并不完全正确。 继续尝试一下,以便我可以说明和解释该过程:
sed s/project/project_name/ sed.txt
您可以在输出中看到project
的第一个实例已更改为project_name
:
system "echo 'project_name:$project' >> logfile"; system "echo 'version:$version' >> logfile"; system "echo 'optionalid:$optionalid' >> logfile"; system "echo 'nodes:$nodes' >> logfile"; system "echo 'threads:$threads' >> logfile";
但是,第二个实例不是,即使它确实与您的正则表达式匹配。 从第一个示例知道, sed
似乎更改了输入中的每个匹配字符串,而不仅仅是第一个匹配项,因为sed
更改了logfile
每个实例。
区别在于, logfile
每个实例都位于单独的行中,而同一行中有两个project
实例。 为什么这会有所作为? sed
被实现为行编辑器。 每个单独的行一次放入一个内存,然后作为一个单元进行操作。 在运行sed
,请记住这一点,因为所有命令行选项均受此设计原则限制(这使sed
大多数实现都没有与系统内存有关的文件大小限制)。 默认情况下,每行被视为sed
命令的新执行。 即使在第一个示例中没有出现这种方式,每个sed
命令也仅替换匹配字符串的第一个实例。 但是,您可以简单地使用g
标志进行更改。
执行相同的sed
命令,但是这次最后加上g
:
sed s/project/project_name/g sed.txt
这次, project
两个实例在第一行都更改为project_name
:
system "echo 'project_name:$project_name' >> logfile"; system "echo 'version:$version' >> logfile"; system "echo 'optionalid:$optionalid' >> logfile"; system "echo 'nodes:$nodes' >> logfile"; system "echo 'threads:$threads' >> logfile";
您可能还记得g
是global的缩写。
sed
另一个强大功能是在搜索和替换操作之前运行初步搜索,以查看您是否在要执行命令的行上。 这几乎就像在sed
内部执行grep
。 在您的示例中,您可能想要更改node
变量的日志文件,而不是将其与所有其他输出分组。 为此,您想将字符串logfile
更改为logfile_nodes
,但仅在与节点有关的行上。 这个命令就是这样做的:
sed /nodes/s/logfile/logfile_nodes/ sed.txt
这是输出:
system "echo 'project:$project' >> logfile"; system "echo 'version:$version' >> logfile"; system "echo 'optionalid:$optionalid' >> logfile"; system "echo 'nodes:$nodes' >> logfile_nodes"; system "echo 'threads:$threads' >> logfile";
现在,尝试在使用grep
同时使用sed
命令中学习到的一些关于正则表达式的知识。 您可以使用sed
内部的以下正则表达式来更改每个以冒号结尾的字符串:
sed s/[a-z]*:/value:/g sed.txt
输出看起来像这样:
system "echo 'value:$project' >> logfile"; system "echo 'value:$version' >> logfile"; system "echo 'value:$optionalid' >> logfile"; system "echo 'value:$nodes' >> logfile"; system "echo 'value:$threads' >> logfile";
这很酷,但不是很合逻辑。 它不是很合逻辑的原因是因为您在所有变量之前都具有单词value
,而无法知道哪个变量是哪个。 但是,您可以使用sed
另一个功能将其变成一个真实的示例。
“与”号(&)表示正则表达式匹配的字符串。 换句话说,如果[az]*:
证明是project:
在特定的行上,“&”号将保留该值。 这可能非常有用。 看一下这个例子:
sed s/[a-z]*:/new_\&/g sed.txt
这次,您更改了每个匹配的字符串,但是保留了与每个变量关联的标识符:
system "echo 'new_project:$project' >> logfile"; system "echo 'new_version:$version' >> logfile"; system "echo 'new_optionalid:$optionalid' >> logfile"; system "echo 'new_nodes:$nodes' >> logfile"; system "echo 'new_threads:$threads' >> logfile";
您还可以使用sed
一次执行多项操作。 要一次执行多个命令序列,必须在每个表达式之前使用-e
标志。 缺省情况下, sed
将第一个参数解释为一个表达式,但是在运行多个命令时需要更加明确,因此需要-e
标志。 例如:
sed -e s/[a-z]*:/value:/g -e s/logfile/name/g sed.txt
您可以看到在这种情况下sed
在适当的位置插入了value:
和name
:
system "echo 'value:$project' >> name"; system "echo 'value:$version' >> name"; system "echo 'value:$optionalid' >> name"; system "echo 'value:$nodes' >> name"; system "echo 'value:$threads' >> name";
正如您开始看到的那样, sed
可以是一个非常强大的工具,可以在大规模批处理过程中编辑文件。 在前面的示例中,您正在处理单个文件,就像使用grep
。 不要忘记这些实用程序的部分功能是跨多个文件运行它们,您可以使用通配符或文件列表来代替在本教程中一直使用的单个文件。
本教程首先介绍了正则表达式,然后介绍了grep
和sed
。 grep
是功能强大的搜索实用程序,而sed
是功能更强大的搜索和替换实用程序。 awk
下一步,使用成熟的命令行编程语言中的正则表达式。 就像sed
一样,当在命令行上使用awk
时,它将接受基于行的输入。 awk
解释一行输入,但与sed
不同,它将行中的每一条输入作为变量处理,这些变量可用作内联代码的输入和输出。
应当注意,AWK(大写)是一种成熟的编程语言,可用于编写脚本(而不是仅在命令行上使用),但是本教程重点介绍awk
,这是命令行实用程序即时解释AWK命令。
顺便说一句,如果有人正在阅读本文并试图考虑您所学到的一切的实际用途,那么我只是使用grep
在一些旧代码中搜索了很好的awk
示例:
grep awk */*.pl
大多数系统管理员或程序员每天都会发现这些工具的用途。 这是我的输出的几行:
Edaemon/m_checkcurrentdisk.pl:$freespace = `awk '(NR==1) {print \$4 / 1024 / 1024}' grep.tmp`; Edaemon/m_getdatetime.pl:$month = `awk '(NR==1) {print \$2}' datetime.txt`; Odaemon/odaemon.beowulf.dvd.pl:$filesize = `awk '(NR==1) {print \$1}' temp.txt`;
这些都是很好的示例,因为它们显示了awk
基本用法。 首次尝试时,请使其更加简单。 对于使用awk
进行的测试,请在空目录中创建以下文件(每个文件的内容无关,它们可以为空):
Screenshot_1.jpg Screenshot_2.jpg Screenshot_3.jpg awk.txt regular.txt sed.txt
默认情况下, awk
读取输入文件中的每一行,并将内容分成由空格确定的变量。 在一个非常简单的示例中,您可以将ls
的输出用作awk
输入并打印结果。 本示例使用带有管道字符(|)的ls
将输出发送到awk
:
ls | awk ' { print $1 } '
随后, awk
在每一行上打印第一项,在这种情况下,这是每一行上的唯一项:
Screenshot_1.jpg Screenshot_2.jpg Screenshot_3.jpg awk.txt regular.txt sed.txt
那真的很基本。 在下一个示例中,使用ls -l
为awk
生成多列输入:
ls -l
ls
实现因系统而异,但这是一些示例输出:
total 432 -rw-rw-rw- 1 guest guest 169074 Oct 15 14:51 Screenshot_1.jpg -rw-rw-rw- 1 guest guest 23956 Oct 15 20:56 Screenshot_2.jpg -rw-rw-rw- 1 guest guest 12066 Oct 15 20:57 Screenshot_3.jpg -rw-r--r-- 1 tuser tuser 227 Oct 15 20:16 awk.txt -rw-r--r-- 1 tuser tuser 233 Oct 15 19:35 regular.txt -rw-r--r-- 1 tuser tuser 227 Oct 15 23:16 sed.txt
请注意,文件所有者是每一行的第三项,文件名是每一行的第九项(默认情况下,项目用awk
的空格分隔)。 您可以使用awk
通过在每行上打印第三和第九个变量来从此列表中拉出文件所有者和文件名。 这是如何做:
ls -l | awk ' { print $3 " " $9 } '
您会注意到awk
的print
命令有两个引号和一个空格。 这只是在输出中的文件所有者和文件名之间打印一个空格:
guest Screenshot_1.jpg guest Screenshot_2.jpg guest Screenshot_3.jpg tuser awk.txt tuser regular.txt tuser sed.txt
您可以在awk
打印语句中的变量之间用引号引起来的文本。
现在,您已经了解了如何使用awk
的基础知识,但是本教程不是关于正则表达式的吗? 在awk
,正则表达式被大量使用。 最常见的示例是在awk
命令之前加一个正则表达式,该正则表达式指定要操作的行。 与sed
, awk
中的正则表达式封装在正斜杠中。 例如,如果您只想对tuser
拥有的文件进行操作,则可以使用以下命令:
ls -l | awk ' /tuser/ { print $3 " " $9 } '
该命令产生以下输出:
tuser awk.txt tuser regular.txt tuser sed.txt
在另一个示例中,您可能想要更改每个文本文件的文件扩展名而不触摸图像文件。 为此,您需要使用句点而不是空格来分隔输入变量,然后使用正则表达式表示您只想搜索文本文件。 要基于句点拆分变量,请使用-F
标志,后跟要在引号中使用的字符。 尝试以下示例,将awk
输出通过管道传递到外壳程序(它将执行awk
生成的命令):
s | awk -F"." ' /txt/ { print "mv " $1 "." $2 " " $1 ".doc" } ' | bash
随后的ls -l
将显示新文件名:
-rw-rw-rw- 1 guest guest 169074 Oct 15 14:51 Screenshot_1.jpg -rw-rw-rw- 1 guest guest 23956 Oct 15 20:56 Screenshot_2.jpg -rw-rw-rw- 1 guest guest 12066 Oct 15 20:57 Screenshot_3.jpg -rw-r--r-- 1 tuser tuser 227 Oct 15 20:16 awk.doc -rw-r--r-- 1 tuser tuser 233 Oct 15 19:35 regular.doc -rw-r--r-- 1 tuser tuser 227 Oct 15 23:16 sed.doc
记住,这些是开始使用awk
的基础知识,但是AWK是一种成熟的编程语言,其功能远远超过本教程中介绍的内容。 看一下awk man
页。 如果您想学习更多,明智的做法是购买一本好书。
本教程中的示例应该足以使您基本了解使用正则表达式的UNIX过滤器以及如何在命令行上使用它们。 使用的三个实用程序grep
, sed
和awk
具有许多内置选项和功能,这些功能远远超出了本教程中讨论的开始课程。 有些书专门讨论sed
和awk
。 在grep
的man
页中搜索以了解有关其功能的更多信息。
如果您觉得自己已经掌握了正则表达式的基础知识并想迈出下一步,那么Perl是另一种很棒的语言,它可以充分利用正则表达式。 Perl的高手喜欢那些简明而又高效的代码行,对于陌生的用户来说,这似乎是毫无意义的字符串。
如果您已按照本系列中的每个教程进行了学习,那么现在您已经了解了命令行上的基本文件操作,如何使用vi
文本编辑器以及如何使用命令行过滤器。
请密切注意本系列的下一篇教程,该教程将介绍Shell技巧和窍门。 同时,在本教程中,您将学习有关正则表达式和实用程序的所有知识。 它们使您可以将漫长而复杂的任务变成您引以为傲的快速,优雅的解决方案!
翻译自: https://www.ibm.com/developerworks/aix/tutorials/au-unixtips3/index.html