摘自 Linux Shell 脚本攻略 第四章 让文本飞
使用正则表达式
位置标记
位置标记锚点(position marker anchor)是标识字符串位置的正则表达式。默认情况下,正
则表达式所匹配的字符可以出现在字符串中任何位置
标识符
标识符是正则表达式的基础组成部分。它定义了那些为了匹配正则表达式,必须存在(或不
存在)的字符
数量修饰符
一个标识符可以出现一次、多次或是不出现。数量修饰符定义了模式可以出现的次数
其他
还有其他一些特殊字符可以调整正则表达式的匹配方式
一些例子
能够匹配任意单词的正则表达式
( +[a-zA-Z]+ +)
开头的+表示需要匹配一个或多个空格。字符组[a-zA-Z]用于匹配所有的大小写字母。随后的+
表示至少要匹配一个字母,多者不限。最后的+表示需要匹配一个或多个空格来终结单词
这个正则表达式无法匹配句子末尾的单词。要想匹配句尾或是逗号前的单词,需要将正则表达式改写为
( +[a-zA-Z]+[?,.]? +)
匹配ip地址
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}
处理特殊字符
正则表达式用$、^、.、*、+、{以及}等作为特殊字符。但是如果我们希望将这些字符作
为普通字符使用,应该怎么做呢?来看一个正则表达式:a.txt
该正则表达式能够匹配字符a,然后是任意字符(由.负责匹配),接着是字符串txt。但是 我们希望.能够匹配字面意义上的.,而非任意字符。因此需要在.之前加上一个反斜线(这叫 作“字符转义”)。这表明正则表达式希望匹配的是字面含义,而不是它所代表的特殊含义。因此, 最终的正则表达式就变成了a.txt
可视化正则表达式
正则表达式不容易理解。幸好有一些将正则表达式进行可视化的工具。你可以在页面 http://www.regexper.com中输入正则表达式,然后创建出一副图示来帮助你理解。图4-1就是一个 简单的正则表达式的可视化截图
使用cut按列切分文件
选项-f可以指定要提取的字段
$ cat a.txt
No Name Mark Percent
01 tom 69 91
02 jack 71 87
03 alex 68 98
# -d 设置分割符为空格
$ cut -f 2 -d ' ' a.txt
Name
tom
jack
alex
$ cut -f 2,3 -d ' ' a.txt
Name Mark
tom 69
jack 71
alex 68
cut命令也能够从stdin中读取输入
$ echo "1 2 3 4" |cut -f 2 -d ' '
2
我们也可以用–complement选项显示出没有被-f指定的那些字段
$ cut -f 3 -d ' ' --complement a.txt
No Name Percent
01 tom 91
02 jack 87
03 alex 98
指定字段的字符或字节范围
固定列宽的报表在列与列之间都存在数量不等的空格1。你没法根据字段的位置来提取值, 但是可以根据字符位置提取。cut命令可以根据字节或者字符来指定选择范围
我们使用上面介绍的记法,结合下列选项将字段指定为某个范围内的字节、字符或字段
- -b 表示字节
- -c 表示字符
- -f 用于定义字段
打印第2到第5个字符
$ cut -c 2-5 range_fields.txt
bcde
bcde
bcde
bcde
打印前2个字符
$ cut -c -2 range_fields.txt
ab
ab
ab
ab
选项–output-delimiter可以指定输出分隔符
$ cut -c 1-2,6-9 range_fields.txt --output-delimiter=','
ab,fghi
ab,fghi
ab,fghi
ab,fghi