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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值