01 2019 档案

摘要:BEGIN 与 END 这两个特殊的“模式”,它们提供的 awk 程序起始(startup)与清除(cleanup)操作,常见于大型 awk 程序中,且通常写在个别文件里,而不是命令行上: BEGIN { 起始操作程序代码(startup code)} pattern1 { action1 } pa 阅读全文
posted @ 2019-01-23 10:06 Avention 阅读(92) 评论(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 阅读(181) 评论(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 阅读(375) 评论(0) 推荐(0)
摘要:awk 本身所提供的功能完备,已经是一个很好用的程序语言了。以后会好好地介绍该语言的精髓。虽然 awk 能做的事很多,但它主要的设计是要在 Shell脚本中发挥所长:做一些简单的文本处理,例如取出字段并重新编排这一类。接下来将介绍 awk 的基本概念,随后你看到这样的“单命令行程序(one-line 阅读全文
posted @ 2019-01-23 10:03 Avention 阅读(198) 评论(0) 推荐(0)
摘要:由于 UNIX 鼓励使用文本型数据,因此系统上最常见的数据存储类型就是文本了,在文本文件下,一行表示一条记录。这里要介绍的是在一行内用来分隔字段的两种惯例。首先是直接使用空白(whitespace),也就是用空格键(space)或制表(tab)键: #字符起始的行表示注释,可忽略(这是一般的习惯,注 阅读全文
posted @ 2019-01-23 10:02 Avention 阅读(215) 评论(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)
摘要:-n 选项修改了 sed 的默认行为。当提供此选项时,sed 将不会在操作完成后打印模式空间的最后内容。反之,若在脚本里使用 p,则会明白地将此行显示出来。举例来说,我们可以这样模拟 grep : sed -n '/<HTML>/p' *.html 仅显示<HTML>这行 [many@aventio 阅读全文
posted @ 2019-01-23 09:12 Avention 阅读(111) 评论(0) 推荐(0)
摘要:如前所述,sed 默认的会将每一个编辑命令(editing command)应用到每个输入行。而现在我们要告诉你的是:还可以限制一条命令要应用到哪些行,只要在命令前置一个地址(address)即可。因此,sed 命令的完整形式是: address command 行编号 可以使用绝对的行编号作为地址 阅读全文
posted @ 2019-01-23 09:12 Avention 阅读(123) 评论(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 阅读(242) 评论(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 阅读(206) 评论(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 阅读(133) 评论(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 阅读(119) 评论(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 阅读(185) 评论(0) 推荐(0)
摘要:再介绍两个 mate 字符就能完成整个 BRE 的介绍了。这两个 meta 字符是脱字符号(^)与货币符号($),它们叫做锚点(anchor),因为其用途在限制正则表达式匹配时,真对要被匹配字符串的开始或结尾进行匹配(^在此处的用法与方括号表达式里的完全不同)。假定现在有一串要进行匹配的字:abcA 阅读全文
posted @ 2019-01-23 09:03 Avention 阅读(321) 评论(0) 推荐(0)
摘要:最先开始是匹配单个字符。可采用集中方式做到:以一般字符、以转义的 meta 字符、以 . meta 字符,或是用方括号表达式: 一般字符指的是未列于 POSIX BRE 于 ERE 的 meta 字符,包括所有文字和数字字符、绝大多是的空白字符以及标点符号字符。因此,正则表达式 a ,匹配于字符 a 阅读全文
posted @ 2019-01-23 09:02 Avention 阅读(231) 评论(0) 推荐(0)
摘要:BRE 提供一种叫后向引用的机制,指的是“匹配于正则表达式匹配的先前的部分”。使用后向引用的步骤有两个。第一步是将子表达式包围在 \( 与 \) 里;单个模式里可包括之多9个子表达式,且可为嵌套结构。 下一步是在同一模式之后使用\digit,digit指的是介于1至9的数字,指的是“匹配于第n个先前 阅读全文
posted @ 2019-01-23 09:02 Avention 阅读(151) 评论(0) 推荐(0)
摘要:为配合非英语的环境,POSIX 标准强化其字符集范围的能力(例如,[a-z]),以匹配非英文字母字符。 POSIX 也在一般术语上作了些变动,我们早先看到的范围表达式在 UNIX 里通常称为字符集,在 POSIX 的标准下,现在叫做方括号表达式。在方括号表达式里,除了上面的字符之外,另有额外的组成部 阅读全文
posted @ 2019-01-23 09:01 Avention 阅读(300) 评论(0) 推荐(0)
摘要:BRE 与 ERE 共享一些常见的特性,不过仍有些重要差异。我们会从 BRE 的说明开始,再介绍 ERE 附加的 meta 字符,最后针对使用相同(或类似)meta 字符但拥有不同语义的情况进行说明。 BRE 是由多个组成部分所构建,一开始提供数种匹配单个字符的方式,而后又结合额外的 meta 字符 阅读全文
posted @ 2019-01-23 09:01 Avention 阅读(160) 评论(0) 推荐(0)
摘要:正则表达式是一种表示方式,让你可以查找匹配特定准则的文本,例如,“以字母 a 开头”。此表示法让你可以写一个表达式,选定或匹配多个数据字符串。 很多的UNIX工具程序沿用某一种正则表达式形式来强化本身的功能。这里列举一部分例子: 用来寻找匹配文本行的 grep 工具族:grep 与 egrep ,以 阅读全文
posted @ 2019-01-22 22:55 Avention 阅读(350) 评论(0) 推荐(0)
摘要:本节提供有关正则表达式构造与匹配方式的概述。特别会提及 POSIX BRE 与 ERE 构造,因为它们想要将大部分 UNIX 工具里的两种正则表达式基本风格(flavors)加以正式化。 gerp 语法 grep [ options ... ] pattern-spec [ files ... ] 阅读全文
posted @ 2019-01-22 22:54 Avention 阅读(284) 评论(0) 推荐(0)
摘要:grep 最简单的用法就是使用固定字符串: [many@avention Desktop]$ who many :0 2019-01-05 17:46 (:0) many pts/0 2019-01-05 17:46 (:0) [many@avention Desktop]$ who | grep 阅读全文
posted @ 2019-01-22 22:52 Avention 阅读(155) 评论(0) 推荐(0)
摘要:UNIX程序员偏好处理文本的行与列。文本型数据比二进制数据更具灵活性,且UNIX系统也提供许多工具,让用户可以轻松地剪贴文本。 在本章中,讨论编写Shell脚本时经常用到的两个基本操作;文本查找(seareching 寻找含有特定文本的行)与文本替换(substitution 更换找到的文本)。 虽 阅读全文
posted @ 2019-01-22 22:51 Avention 阅读(145) 评论(0) 推荐(0)
摘要:以 grep 程序查找文本是相当方便的。在 POSIX 系统上,grep 可以在两种正则表达式风格中选择一种,或是执行最简单的字符串匹配。 传统上,有三种程序,可以用来查找整个文本文件: grep 最早的文本匹配程序,使用 POSIX定义的基本正则表达式。 egrep 扩展式 grep 。这个程序使 阅读全文
posted @ 2019-01-22 22:51 Avention 阅读(213) 评论(0) 推荐(0)
摘要:Linux Shell 环境中支持输入输出重定向,用符号"<"和">"来表示。0、1和2分别表示标准输入、标准输出和标准错误信息输出,可以用来指定需要重定向的标准输入或输出,比如 2>a.txt 表示将错误信息输出到文件a.txt中。 同时,还可以在这三个标准输入输出之间实现重定向,比如将错误信息重 阅读全文
posted @ 2019-01-08 10:58 Avention 阅读(198) 评论(0) 推荐(0)
摘要:一 变量 变量:本质上是程序中保存用户数据的一块内存空间,变量名就是内存空间地址。 Shell中:变量可由字母数字和下划线组成,以字母或下划线开头。 命名:PATH=/sbin JAVA_HOME=”/usr/lib” (变量名区分大小写) 在shell中,变量的数据类型无需显式声明,变量的数据类型 阅读全文
posted @ 2019-01-08 10:57 Avention 阅读(5233) 评论(0) 推荐(0)
摘要:bash shell 脚本的方法有多种,现在作个小结。假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/data/shell目录中并已有执行权限。 方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本: cd /data/shell ./hello.sh 阅读全文
posted @ 2019-01-08 10:57 Avention 阅读(176) 评论(0) 推荐(0)
摘要:linux export 的作用 功能说明:设置或显示环境变量。 语 法:export [-fnp][变量名称]=[变量设置值] 补充说明:在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅及于该此登陆操作。 参 阅读全文
posted @ 2019-01-08 10:56 Avention 阅读(189) 评论(0) 推荐(0)