写在前面, 语系对正则匹配会有影响。
特殊符号 | 代表意义 |
[: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