摘要: BEGIN 与 END 这两个特殊的“模式”,它们提供的 awk 程序起始(startup)与清除(cleanup)操作,常见于大型 awk 程序中,且通常写在个别文件里,而不是命令行上: BEGIN { 起始操作程序代码(startup code)} pattern1 { action1 } pa 阅读全文
posted @ 2019-01-23 10:06 Avention 阅读(91) 评论(0) 推荐(0)
摘要: 如需从输入的数据文件中取出特定的文本行,主要的工具为 grep 程序。POSIX 采用三种不同 grep 变体:grep、egrep 与 fgrep 的功能,整合为单个版本,通过不同的选项,分别提供这三种行为模式。 虽然可以直接查找字符串常数,但是正则表达式能提供一个功能更强大的方式,描述你要找的文 阅读全文
posted @ 2019-01-23 10:06 Avention 阅读(153) 评论(0) 推荐(0)
摘要: 在一些简单程序中,你可以使用 -F 选项修改字段分隔字符。显示 /etc/passwd 文件里的用户名称与全名,你可以使用: awk -F: '{ print $1,$5 }' /etc/passwd -F 选项会自动地设置 FS 变量。请注意,程序不必直接参照 FS 变量,也不用必须管理读取的记录 阅读全文
posted @ 2019-01-23 10:05 Avention 阅读(178) 评论(0) 推荐(0)
摘要: 就像我们已经介绍过的:大多数时候,你只是想把选定的字段显示出来,或者重新安排其顺序。简单的打印可使用 print 语句做到,只要提供给它需要打印的字段列表,变量或字符串即可: awk -F: '{ print "User", $1 , "is really", $5}' /etc/passwd 简单 阅读全文
posted @ 2019-01-23 10:05 Avention 阅读(101) 评论(0) 推荐(0)
摘要: awk 的基本模式不同于绝大多数的程序语言。它其实比较类似于 sed: awk 'program' [ file ... ] awk 读取命令行上所指定的各个文件(若无,则为标准输入),一次读取一条记录(行)。再针对每一行,应用程序所指定的命令。awk 程序基本架构为: pattern { acti 阅读全文
posted @ 2019-01-23 10:04 Avention 阅读(111) 评论(0) 推荐(0)
摘要: awk 设计的重点就在字段与记录上:awk 读取输入记录(通常是一些行),然后自动将各个记录切分为字段。awk 将每条记录呃逆的字段数目,存储到内建变量 NF。 默认以空白分隔字段--例如空格与制表字符(或两者混用),像 join 那样。这通常就足够使用了,不过,其实还有其他选择:你可以将 FS 变 阅读全文
posted @ 2019-01-23 10:04 Avention 阅读(116) 评论(0) 推荐(0)
摘要: join 命令可以将多个文件结合在一起,每个文件里的每条记录,都共享一个键值(key),键值指的是记录中的主字段,通常会是用户名称、个人姓氏、员工编号之类的数据。举例来说,两个文件,一个列出所有业务员销售业绩,一个列出每个业务员应该实现的业绩: #业务员 量 joe 100 jane 200 her 阅读全文
posted @ 2019-01-23 10:03 Avention 阅读(373) 评论(0) 推荐(0)
摘要: awk 本身所提供的功能完备,已经是一个很好用的程序语言了。以后会好好地介绍该语言的精髓。虽然 awk 能做的事很多,但它主要的设计是要在 Shell脚本中发挥所长:做一些简单的文本处理,例如取出字段并重新编排这一类。接下来将介绍 awk 的基本概念,随后你看到这样的“单命令行程序(one-line 阅读全文
posted @ 2019-01-23 10:03 Avention 阅读(197) 评论(0) 推荐(0)
摘要: 由于 UNIX 鼓励使用文本型数据,因此系统上最常见的数据存储类型就是文本了,在文本文件下,一行表示一条记录。这里要介绍的是在一行内用来分隔字段的两种惯例。首先是直接使用空白(whitespace),也就是用空格键(space)或制表(tab)键: #字符起始的行表示注释,可忽略(这是一般的习惯,注 阅读全文
posted @ 2019-01-23 10:02 Avention 阅读(214) 评论(0) 推荐(0)
摘要: cut 命令是用来剪下文本文件里的数据,文本文件可以是字段类型或是字符类型。后一种数据类型在遇到需要从文件里剪下特定的列时,特别方便。请注意:一个制表字符在此被视为单个字符。 举例来说,下面的命令可显示系统上每个用户的登录名及其全名: [root@avention etc]# cut -d : -f 阅读全文
posted @ 2019-01-23 10:02 Avention 阅读(314) 评论(0) 推荐(0)
摘要: 了解行(line)与字符串(string)的差异是相当重要的。大部分简易程序都是处理输入数据的行,像 grep 与 egrep,以及 sed 大部分的工作(99%)都是这样。在这些情况下,不会有内嵌的换行符出现在将要匹配的数据中,^与$则分别表示行的开头与结尾。 然而,对可应用正则表达式的程序语言, 阅读全文
posted @ 2019-01-23 10:01 Avention 阅读(148) 评论(0) 推荐(0)
摘要: 很多的应用程序,会将数据视为记录与字段的结合,以便于处理。一条记录(record)指的是相关信息的单个集合,例如以企业来说,记录可能含有顾客、供应商以及员工等数据,以学校机构来说,则可能有学生数据。而字段(field)指的就是记录的组成部分,例如姓、名或者街道地址。 阅读全文
posted @ 2019-01-23 10:01 Avention 阅读(136) 评论(0) 推荐(0)
摘要: 有个问题我们一直没讨论到:有多少文本会匹配 ?事实上,这应该包含两个问题。第二个问题:从哪开始匹配?执行简单的文本查找,例如使用 grep 或 egrep 时,则这两个问题都不重要,你只要知道是否有一行是匹配的,若有,则看看那一行是什么。至于在这个行里,是从哪儿开始匹配,或者它扩展到哪里,已经不重要 阅读全文
posted @ 2019-01-23 09:13 Avention 阅读(167) 评论(0) 推荐(0)
摘要: 如前所述,sed 默认的会将每一个编辑命令(editing command)应用到每个输入行。而现在我们要告诉你的是:还可以限制一条命令要应用到哪些行,只要在命令前置一个地址(address)即可。因此,sed 命令的完整形式是: address command 行编号 可以使用绝对的行编号作为地址 阅读全文
posted @ 2019-01-23 09:12 Avention 阅读(123) 评论(0) 推荐(0)
摘要: -n 选项修改了 sed 的默认行为。当提供此选项时,sed 将不会在操作完成后打印模式空间的最后内容。反之,若在脚本里使用 p,则会明白地将此行显示出来。举例来说,我们可以这样模拟 grep : sed -n '/<HTML>/p' *.html 仅显示<HTML>这行 [many@aventio 阅读全文
posted @ 2019-01-23 09:12 Avention 阅读(111) 评论(0) 推荐(0)
摘要: 先前已经提过,除斜杠还可以使用其他任意字符作为定界符;在正则表达式或替代文本里,也能转义定界符,不过这么做可能会让命令变得很难看懂: sed 's/\/home\/tolstoy\//\/home\/.lt\//' 在前面的3.2.2节里,我们已经讲到 POSIX 的 BRE 时,已说明后向引用在正 阅读全文
posted @ 2019-01-23 09:11 Avention 阅读(150) 评论(0) 推荐(0)
摘要: sed 的工作方式相当直接。命令行上的每个文件会依次打开与读取。如果没有文件,则使用标准输入,文件名“-”(单个破折号)可用于表示标准输入。 [many@avention Desktop]$ sed 's/hello/HELLO/' - hello world 输入 HELLO world 输出 s 阅读全文
posted @ 2019-01-23 09:11 Avention 阅读(114) 评论(0) 推荐(0)
摘要: 很多 Shell 脚本的工作都从通过 grep 或 egrep 取出所需的文本开始。正则表达式查找的最初结果,往往就成了要拿来做进一步处理的“原始数据”。通常,文本替换至少需要做意见事,就是将一些字以另一些字取代,或者是删除匹配行的某个部分。 一般来说,执行文本替换的正确程序应该是 sed--流编辑 阅读全文
posted @ 2019-01-23 09:10 Avention 阅读(240) 评论(0) 推荐(0)
摘要: 你可能会常在管道(pipeline)中间使用 sed,以执行替换操作。做法是使用 s 命令--要求正则表达式寻找,用替代文本替换匹配的文本,以及可选用的标志: sed 's/:.*//' /etc/passwd/ | sort -u 删除第一个冒号之后的所有东西,排序列表并删除重复部分 sed 语法 阅读全文
posted @ 2019-01-23 09:10 Avention 阅读(150) 评论(0) 推荐(0)
摘要: 很多程序提供正则表达式语法扩展。这类扩展大多采取反斜杠加一个字符,以形成新的运算符。类似 POSIX BRE 里 \( \) 与 \{ \} 的反斜杠。 最常见的扩展为 \< 与 \> 运算符,分别匹配 “单词 word”的开头与结尾。单词是由字母、数字、及下划线组成的。我们称这类字符为单词组成。 阅读全文
posted @ 2019-01-23 09:09 Avention 阅读(195) 评论(0) 推荐(0)
摘要: 有两种不同的正则表达式风格时经年累月的历史产物。虽然 egrep 风格的扩展正则表达式在 UNIX 早期开发时就已经存在了,但 Ken Thompson 并不觉得有必要在 ed 编辑器里使用这样全方位的正则表达式。 ed 的程序代码后来成了 grep 的基础(grep 为 ed 命令中 g/re/p 阅读全文
posted @ 2019-01-23 09:09 Avention 阅读(205) 评论(0) 推荐(0)
摘要: 在 ERE 里运算符的优先级和 BRE 一样。由高至低列出了 ERE 运算符的优先级。 运算符 含义 [..] [= =] [: :] 用于字符对应的方括号符号 \metacharacter 转义的 meta 字符 [ ] 方括号表达式 ( ) 分组 *+?{} 重复前置的正则表达式 无符号(no 阅读全文
posted @ 2019-01-23 09:08 Avention 阅读(194) 评论(0) 推荐(0)
摘要: 在 ERE 里,我们已经提到运算符是被应用到“前置的正则表达式”。这是因为圆括号 (...) 提供分组功能,让接下来的运算符可以应用。举例来说,(why)+ 匹配于一个连续重复的多个 why 。 在必须用到交替时, 分组的功能就特别好用(也是必须的)。它可以让你用以构建复杂并灵活的正则表达式。 [T 阅读全文
posted @ 2019-01-23 09:07 Avention 阅读(132) 评论(0) 推荐(0)
摘要: ^ 与 $ 在这里表示的意义与 BRE 里的相同:将正则表达式停驻在文本字符串(或行)的起始或结尾处。不过有个明显不同的地方就是:在 ERE 里, ^ 与 $ 永远是 meta 字符。所以,像 ab^cd 与 ef$gh 这样的正则表达式仍是有效的,只是无法匹配任何东西。因为 ^ 前置了文本,与 $ 阅读全文
posted @ 2019-01-23 09:07 Avention 阅读(117) 评论(0) 推荐(0)
摘要: ERE 在匹配多个字符这方面,与 BRE 有很明显的不同。不过,在 * 的处理上和 BRE 是相同的。 区间表达式可用于 ERE 中,但它们是写在花括号里({}),且不需要前置反斜杠字符。因此“要刚好重现5个a”的写法为 a{5}。而 \{ 与 \} 则可用以匹配字面上的花括号。当在 ERE 里 { 阅读全文
posted @ 2019-01-23 09:06 Avention 阅读(3031) 评论(0) 推荐(0)
摘要: 方括号表达式易于表示“匹配于此字符,或其他字符,或 ...”,但不能指定“匹配于这个序列,或其他序列,或 ...”。要达到后者的目的,你可以使用交替运算符,即 | 。你可以简单写好两个字符序列,再以 | 将其隔开。例如 read | write 匹配于 read 与 write 两者。可以使用多个该 阅读全文
posted @ 2019-01-23 09:06 Avention 阅读(131) 评论(0) 推荐(0)
摘要: 在匹配单个字符的情况下,ERE 本质上是与 BRE 一致的。特别是像一般字符、用以转义 meta 字符的反斜杠,以及方括号表达式,这些行为模式都与先前提及的 BRE 相同。较有名的一个例外出现在 awk 里:其 \ 符号在方括号表达式内表示其他含义。因此,如需匹配作方括号、连字符、右方括号或是反斜杠 阅读全文
posted @ 2019-01-23 09:05 Avention 阅读(123) 评论(0) 推荐(0)
摘要: ERE 里是没有后向引用的。圆括号在 ERE 里具特殊意义,但和 BRE 里的使用有有所不同。在 ERE 里,\( 与 \) 匹配的是字面上的左括号和有括号。 阅读全文
posted @ 2019-01-23 09:05 Avention 阅读(118) 评论(0) 推荐(0)
摘要: 在数学表达式里,正则表达式的运算符具有某种已定义的优先级,指的是某个运算符(优先级较高)将比其他运算符先被处理。 BRE运算符优先级,由高至低 运算符 表示含义 [..] [==] [::] 用于字符排序的方括号符号 \metacharacter 转义的 meta 字符 [ ] 方括号表达式 \( 阅读全文
posted @ 2019-01-23 09:04 Avention 阅读(182) 评论(0) 推荐(0)
摘要: ERE 的含义就如同其名字所示:拥有比基本正则表达式更多的功能。BRE 与 ERE 在大多数 meta 字符与功能上几乎是完全一致,但 ERE 里有些 meta 字符看起来与 BRE 类似,却具有完全不同的意义。 阅读全文
posted @ 2019-01-23 09:04 Avention 阅读(142) 评论(0) 推荐(0)
摘要: 匹配多字符最简单的方法就是把它们一个接一个(连接)列出来,所以正则表达式 ab 匹配于 ab, ..(两个点号)匹配于任意两个字符,而 [[:upper:][:lower:]] 则匹配于任意一个大写字符,后面接着任意一个小写字符。不过,将这些字符全列出来只有在简短的正则表达式里才好用。 虽然 . ( 阅读全文
posted @ 2019-01-23 09:03 Avention 阅读(183) 评论(0) 推荐(0)
摘要: 再介绍两个 mate 字符就能完成整个 BRE 的介绍了。这两个 meta 字符是脱字符号(^)与货币符号($),它们叫做锚点(anchor),因为其用途在限制正则表达式匹配时,真对要被匹配字符串的开始或结尾进行匹配(^在此处的用法与方括号表达式里的完全不同)。假定现在有一串要进行匹配的字:abcA 阅读全文
posted @ 2019-01-23 09:03 Avention 阅读(321) 评论(0) 推荐(0)
摘要: BRE 提供一种叫后向引用的机制,指的是“匹配于正则表达式匹配的先前的部分”。使用后向引用的步骤有两个。第一步是将子表达式包围在 \( 与 \) 里;单个模式里可包括之多9个子表达式,且可为嵌套结构。 下一步是在同一模式之后使用\digit,digit指的是介于1至9的数字,指的是“匹配于第n个先前 阅读全文
posted @ 2019-01-23 09:02 Avention 阅读(149) 评论(0) 推荐(0)
摘要: 最先开始是匹配单个字符。可采用集中方式做到:以一般字符、以转义的 meta 字符、以 . meta 字符,或是用方括号表达式: 一般字符指的是未列于 POSIX BRE 于 ERE 的 meta 字符,包括所有文字和数字字符、绝大多是的空白字符以及标点符号字符。因此,正则表达式 a ,匹配于字符 a 阅读全文
posted @ 2019-01-23 09:02 Avention 阅读(229) 评论(0) 推荐(0)
摘要: BRE 与 ERE 共享一些常见的特性,不过仍有些重要差异。我们会从 BRE 的说明开始,再介绍 ERE 附加的 meta 字符,最后针对使用相同(或类似)meta 字符但拥有不同语义的情况进行说明。 BRE 是由多个组成部分所构建,一开始提供数种匹配单个字符的方式,而后又结合额外的 meta 字符 阅读全文
posted @ 2019-01-23 09:01 Avention 阅读(160) 评论(0) 推荐(0)
摘要: 为配合非英语的环境,POSIX 标准强化其字符集范围的能力(例如,[a-z]),以匹配非英文字母字符。 POSIX 也在一般术语上作了些变动,我们早先看到的范围表达式在 UNIX 里通常称为字符集,在 POSIX 的标准下,现在叫做方括号表达式。在方括号表达式里,除了上面的字符之外,另有额外的组成部 阅读全文
posted @ 2019-01-23 09:01 Avention 阅读(300) 评论(0) 推荐(0)