Bootstrap

shell 学习笔记 常用命令 正则表达式 cut

摘自 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
;