linux 从头开始その七 (正则)

mac2022-06-30  15

写在前面, 语系对正则匹配会有影响。

特殊符号代表意义[:alnum:]0-9, a-z, A-Z[:alpha:]A-Z, a-z[:blank:]空格和Tab[:cntrl]键盘的控制按键[:digit:]0-9[:graph:]除了空格和Tab以外所有的按键[:lower:]a-z[:print:]代表任何可以被打印的出来的字符[:punct:]代表标点符号[:upper:]A-Z[:space:]任何产生空白的字符串[:xdigit:]代表十六进制的数字类型

 

几个例子:

grep -in 'the' xxx.txt 忽略大小写, 列出行号, 行中有没有出现过 the grep -n 't[ae]st' xx.txt grep -n '[^g]oo' xx.txt 非, 不已g开头 grep -n '[^[:lower:]]oo' oo前不已小写字母开头 grep -n '[^[:lower:]]oo' grep -n '^[^a-zA-Z]' 不以字母开头 grep -v '^$' xx.txt 匹配空白行 v 反向选择 grep -n 'go\{2,5\} a.txt 注意{} 要转义

 

1 很厉害的sed

-n       使用安静模式,在一般的sed用法中, 所有来自stdin的数据会被列出到屏幕上。但如果加上了-n参数后,则只有经过sed处理的那一行才会被显示出来

-e    直接再命令行模式进行seb编辑操作

-f     直接将sed的操作写在一个文件内, 

-r    sed的操作使用的是扩展的正则表达式, 默认的是基础的正则

-i    直接修读取的文件内容, 而不是屏幕输出

n1,n2   function    n1, n2指定操作的行, 

a    新增, a后面可以接字符串, 加再当前行的下一行

c     替换, c后面字符串, 将替换n1, n2的行

d     删除

i      插入, 后面加字符, 插入当前行的上一行

p    打印

s    替换, 可以搭配正则, s/ / /g

sed  必须是单引号

nl /etc/passwd | sed '2,5d' nl 代代行号列出文件的内容,删除2到5行 nl /etc/passwd | sed '2d' 只删除第二行 nl /etc/passwd | sed '2,&d' 删除第三行和它后面所有的行 nl /etc/passwd | sed '2a xxxxxx' 在第二行后面, 就是第三行,加入xxx, 原本的第三行变成第四行, 但是nl显示新加的没行号。 P374 nl /etc/passwd | sed '2a xxxxxxx \[enter] sasdsd' 插入多行 nl /etc/passwd | sed '2,5c xxxx' 正行替换, 被替换的行变成一个xxxx nl /etc/passwd | sed -n '2,5p' 打印2到5行, 注意要加-n sed 's/要替换的字符串/新的字符串/g' /sbin/ifconfig eth0 | grep 'inet' | sed 's/^.*inet //g' 不管它/sbin/ifconfig eth0是什么意思, 就是找到有inet所有的行,^.*inet 替换成空 直接修改内容 sed -i 's/\.$/\!/g' xx.txt 注意有转义, 就是 \.$ 以.结尾的, 都换成! 加了 -i 可以直接修改文件内容。 而不是输出在屏幕上

 

2 正则扩展

egrep  <==> gerp - E

egrep -v '^$|^#' xxx.txt v 反选

 

3 还算好用的awk

last -n 5 | awk '{print $1 "\t" $3}' 注意单引号和双引号的使用, 以tab 分割每行, 取出第一栏和第三栏

$0 代表一整行数据, $1第一栏

awk 还有如下的变量

NF每一行拥有的总段数,几栏NR处理的是第几行数据FS目前的分隔符, 默认时空格 [root@ ~]# last -n 5 | awk '{print $1 "\t lines: " NR "\t columns: " NF }' root lines: 1 columns: 10 root lines: 2 columns: 10 root lines: 3 columns: 10 root lines: 4 columns: 10 root lines: 5 columns: 10

加上逻辑判断

cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t" $3}' 如果第三栏小于10, 则按要求打印 但是第一行没显示出来, 因为FS=":" 从第二行才开始生效 所以可以这样 cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t" $3}'

 

4 文件对比diff  主要是文本文件, 也可能是路径

-b    忽略一行多个空白差异     do it   和  do                  it  的擦别

-B   忽略空白行差异

-i     忽略大小写

diff passwd.old passwd.new < 4d3 左边的文件第四行被删了, 基准是右边的第三行 < 6c5 左边文件的第六行被替换成右边的第五行 。。。。。。

 

5 cmp   二进制文件, 比的是字节

-l   列出虽有不同地方, 默认不加, 只列出一个不同

cmp passwd.ord passwd.new

 

 

 

 

 

 

最新回复(0)