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

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

特殊符号代表意义
[: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

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值