正则表达sed,awk编辑

it2022-06-24  91

正则表达式

基本正则表

^ 匹配行首$ 匹配行尾[ ]集合,匹配集合中的任意单个字符[^] 对集合去反. 匹配单个任意字符*匹配前一个字符任意次数\ {n,m \ } 匹配前一个字符n到m次\ {n \ } 匹配前一个字符n次\ {n,\ } 匹配前一个字符n次及以上\ ( \ ) 保留

扩展正则

+最少匹配一次?最多匹配一次{n,m}匹配n到m次() 组合为整体,保留| 或者\b 单词边界

sed

用法 sed [选项] ‘条件指令’ 文件…

选项

-n 屏蔽默认输出,默认sed会读取文档的全部内容-r :sed支持扩展正则-i :sed修改源文件,默认sed只是通过内存临时修改文件

指令

p输出文档内容 sed -n '1p' user //输出第1行 sed -n '2,4p' user //输出2~4行 sed -n '3p;5p' user //输出第3行第5行zhanghuxinxi sed -n '2,+2p' user //输出第2行,以及后面的2行 sed -n '1~2p' user //查看奇数行 sed -n '2~2p' user //查看偶数行 **sed的定址符可以使用正则表达式,在/ / 中间填写** sed -n '/root/p' user //查看有root的行 sed -n '/^root/' user //查看以root开头的行 sed -n '=' user //查看所有行的行号 sed -n '$=' user //查看最后一行的行号 d 产出行,使用方式和指令p基本一致,不用加-n sed '/nologin$/d' user //删除含有nologin结尾的行 sed '/^install/d' user //删除以install开头的行 sed '$d' user //删除文件的最后一行 sed '/^$/d' user //删除所有空行 s 替换用法: s/old/new/ 默认替换第1个old sed 's/2017/xxxx/' test //所有行的第一个2017 sed '2s/2017/xxxx/2' test //替换第二行第二个2017 sed 's/2017/xxxx/g' //更换所有行的所有2017 sed '3s/2017/xxx/1,2' test //第三行第一,二个2017替换为xxx sed '10,13s/^/#&/' test //在10到13行行首添加# &表示任意字符 sed 's/$/xxx/' test //在行尾添加xxx sed '3s/2017/xxxx/;3s/2017/xxxx' test //更换第3行第1个2017,以及更换后第一个2017 sed -n 's/2017/xxxx/p' test //查看替换之后行的内容 sed 's/2017/ /' test //替换所有行第一个2017为空---删除2017 **替换分隔符"/"可改用其他字符如#,&,便于修改文件路径** sed 's#/bin/bsah#/sbin/sh#' test //将/bin/bash替换为/sbin/sh sed 's/^#an/an/' test //解除以#an开头行的注释 i : 在指定的行之前插入文本a: 在指定的行之后追加文本:c: 替换指定的行 sed '2a xxx' user sed '2i xxx' user sed '2c xxx' user

案例

删除文件中第二个,最后一个字符 sed 's/.//2;s/.$//' 11.txt 将文件中每行的第一个和倒数第一个字符互换 sed -r 's/^(.)(.*)(.)$/\3\2\1/' 11.txt 文件中每行的第一个和第二个字符互换 sed -r 's/(.)(.)(.*)/\2\1\3/' 11.txt 删除文件中所有数字 sed 's/[0-9]//g' 11.txt

AWK

基本操作:awk [选项]’[条件]{指令}’ 文件 print 常用编辑命令,打印 未指定分隔符是,默认将空格,制表符等作为分隔符.

awk -F: '{print $1,$7}' /etc/passwd //以分号分隔的第1,7个字段 -F 指定分隔符 $n 显示第n个字段 awk -F[:/] '{print $1,$7}' /etc/passwd -F[:/] 识别多个分隔符,以: 或/分割 awk -F: '/root/{print $2}' /etc/passwd /root/--正则表达式 含有root的行的第二列 awk -F: '{print NR,NF}' /etc/passwd NR 文件当前的行号 NF:文件当前的列号(有几列)

内置变量 $0:文本中当前行的全部内容 $n:文本中的第n列 NR:文件中当前的行号 NF:文件中当前的列数(有几列) 常量" "

awk -F: '{print $1,"解释器:",$7}' /etcpasswd

处理进程

BEGEIN{}行前处理,读取文件内容前执行,指令执行一次{ }逐行处理,读取文件过程中执行,执行指令n次END{ }行后处理,读取文件结束后处理,执行1次 awk -F: 'BEGIN{print "User\tUID\tHome"} \ {print $1 "\t" $3 "\t" $6} END{print "Total",NR,"lines."}' /etc/passwd

"~包含 !~ 反向匹配

awk -F: '$1~/root/{print $1,$7}' /etc/passwd 输出第一列为root的行的第1.7列

数值/字符串比较设置条件 比较符号: ==,!=,>,<,>=,<= 逻辑测试符号 ||或 $$与

awk -F: 'NR==3{print}' /etc/passwd //输出行号为3的用户记录 awk -F: '$3>=1000{print $1,$3}' /etc/passwd //输出用户UID大于等于1000的账户名称和UID信息 awk -F: ' $3>10 &&$3<20' /etc/passwd /输出账户UID大于10且小于20的账户信息

最新回复(0)