正则表达、sed、awk

1.正则表达

1.1正则表达符号

符号描述
^匹配行首
$匹配行尾
[]匹配集合内任一字符
[^]取反集合内字符
.匹配单个字符
*

匹配前一个字符x次,可0次(x>=0)

{n,m}匹配前一个字符n到m次
{n,}匹配前一个字符n次以上

{n}

匹配前一个字符n次

()

组合整体,把多个字符看成“单个字符”处理
最少匹配一次
最多匹配一次
|或者
\b单词边界(非数字、字母、下划线)
\d任意数字字符
\w匹配数字字母下划线
/s匹配空格、tab键

备注: 注意转义“\”

1.2使用grep正则匹配

注:grep 加入选项‘-E’或者egrep  可以免去‘\’

grep "a\{1,3\}bc" 1.txt

OR

egrep "a{1,3}bc" abc

egrep "^(abc)" abc

egrep "[0-9a-Z]$" abc

2.sed用法(编辑)

sed命令的常用选项如下:

-n(屏蔽默认输出,默认sed会输出读取文档的全部内容)

-r(支持扩展正则)

-i(修改源文件)

  • 条件可以是行号或者/正则/,没有条件时默认为所有行都执行指令
  • 指令可以是p输出、d删除、s替换
  • ‘/’符号可以用其他符号替换,较少转义符号带来的麻烦

2.1 p输出

sed -n 'p'  abc  #输出所有行

sed -n '1!p' abc #输出除了第一行的所有行

sed -n '$p' abc #输出最后一行 

sed -n '3p' abc  #输出第三行

sed -n '2,5' abc #输出2行到五行

sed -n '2p;5p' abc #输出第二行和第五行

sed -n '3,+2p'  abc  #输出第三行以及后面的二行

sed -n '1~2p' abc  # 输出第1,3,5等等行,既奇行,隔行2 

sed -n  '='  abc  #输出行号 


sed -nr '/^root | ^bin/p' abc  #找到root或者bin开头的所有行

2.2 d删除

  1. [root@svr5 ~]# sed '3,5d' a.txt             #删除第3~5行
  2. [root@svr5 ~]# sed '/xml/d' a.txt            #删除所有包含xml的行
  3. [root@svr5 ~]# sed '/xml/!d' a.txt         #删除不包含xml的行,!符号表示取反
  4. [root@svr5 ~]# sed '/^install/d' a.txt    #删除以install开头的行
  5. [root@svr5 ~]# sed '$d' a.txt                #删除文件的最后一行
  6. [root@svr5 ~]# sed '/^$/d' a.txt            #删除所有空行

 2.3 s替换

  1. sed 's/2017/6666/' shu.txt            #把所有行的第1个2017替换成6666
  2. sed 's/2017/6666/2' shu.txt        #把所有行的第2个2017替换成6666
  3. sed '1s/2017/6666/' shu.txt        #把第1行的第1个2017替换成6666
  4. sed '3s/2017/6666/3' shu.txt        #把第3行的第3个2017替换成6666
  5. sed 's/2017/6666/g' shu.txt         #所有行的所有个2017都替换
  6. sed '/2024/s/2017/6666/g' shu.txt    #找含有2024的行,将里面的所有2017替换成6666
  7. sed -r 's/([0-9]+)(\s+)([a-z]+)/\3\2\1/' abc.txt  # 将字母和数字换位置,\n表示替换前的字符位置,以()为分界

 2.4 a/i追加

  1. sed 'a 666' user #所有行的下面追加666
  2. sed '1a 666' user #第1行的下面追加666
  3. sed '/^bin/a 666' user #在以bin开头的行的下面追加666
  4. sed 'i 666' user #所有行的上面添加666
  5. sed '5i 666' user #第5行的上面添加666
  6. sed '$i 666' user #最后1行的上面添加666

2.5 c替换行

  1. sed 'c 666' user #所有行都替换成666
  2. sed '1c 666' user #替换第1行为666

3.awk用法 (提取)

3.1 基本用法

格式1:awk [选项] '[条件]{指令}' 文件

格式2:前置指令 | awk [选项] '[条件]{指令}'

其中,print 是最常用的编辑指令;若有多条编辑指令,可用分号分隔。

Awk过滤数据时支持仅打印某一列,如第2列、第5列等。

处理文本时,默认将空格、制表符作为分隔符。

条件可以用/ /的方式,与sed类似

awk常用内置变量:

$0 文本当前行的全部内容

$1 文本的第1列

$2 文件的第2列

$3 文件的第3列,依此类推

NR 文件当前行的行号

NF 文件当前行的列数(有几列)

  1. awk '{print}' abc.txt                #输出所有
  2. awk '/to/{print}' abc.txt            #输出有to的那行
  3. awk '{print $2}' abc.txt            #输出所有行的第2列
  4. awk '/to/{print $1}' abc.txt        #输出有to的那行的第1列
  5. awk '{print $0}' abc.txt            #输出所有行所有列
  6. awk '{print $0,$1}' abc.txt        #输出所有行所有列,第1列
  7. awk '{print NR}' abc.txt            #输出所有行的行号
  8. awk '{print NR,$0}' abc.txt        #输出所有行的行号,所有列
  9. awk '{print NR,NF}' abc.txt        #输出所有行的行号,列号(有几列)

选项 -F 可以制定分隔符 

  1. awk -F: '{print $1}' user         #文档中如果没有空格,可以用F修改分隔符
  2. awk -F: '{print $1,$6}' user        #使用冒号‘:’作为列的分隔符,显示第1、6列

awk还识别多种单个的字符,比如以“:”或“/”分隔

  1. awk -F [:/] '/^root/{print $1,$10}' user

awk的print指令不仅可以打印变量,还可以打印常量 

  1. awk -F: '{print $1" 的家目录是 "$6}' user #输出常量,加双引号即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值