正则表达式
在linux中,通配符是由shell解释的,而正则表达式是由命令解释的。主要的文本处理工具有grep,sed和awk。
grep匹配模式
grep按下述方式接受选项和参数
grep [options] regex [files]
参数主要有
-i ------------忽略大小写
-o ------------只显示匹配的内容
-v ------------取反,不匹配
-l -------------输出匹配的文件名
-L -------------输出不匹配的文件名
-c -------------count 输出匹配的数目(行数)
-n -------------输出匹配行同时加上行号
-A -------------输出匹配行,及其后面的n行
正则字符
^ ------------行首标记,在[^]表示非
$ -------------结束标记 'abc$'----->abc,hhhhabc
. -------------任意字符 'a.c'-------->abc,atc,ajc
| ------------- 或 --------> 'aaa|bbb'----->aaa,bbbc
正则范围
? ----------------左边第一个字符出现0次或一次
* ----------------左边第一个字符出现0到n次
+ -----------------左边第一个字符出现1到n次
{} ----------------{m}{m,n}{m,}{,n}左边第一个字符出现m/m到n/>m/<n 次
()--------------将候选的元素列出来用|分割--(ab|1|2|3)--代表ab1 ab2或ab3
例子
grep 'root' /root/test/z.txt---------------显示z.txt中含有root的行
egrep '^[a-Z]+[0-9]+[a-Z]' z.txt-----------过滤出字母+数字+字母的行
grep -v "^#" /etc/ssh/sshd_config |grep -v '^ *$' /etc/ssh/sshd_config
------------------过滤掉sshd_config文件中所有的#和空行
sed
sed是一种在线编辑器,它一次处理一行内容,可以将数据进行替换、删除、新增、选取等特定工作
sed的命令格式为
sed [options] 'command' in_file
options
-i:直接修改读取的档案内容
-n:使用安静模式。一半sed用法,文件所有内容都会背列到屏幕上,如果加上-n参数后,只有经过sed特殊处理的那一行才会被列出来。
-e:直接在指令列模式上进行sed的动作编辑
-r:扩展正则表达式
command
'[地址1,地址2][函数][参数]'
1:单行
1,3:范围,从第一行到第三行
$:尾行
正则必须用//包裹起来
函数
a:新增,a插入的字符串在新的一行出现。
c:取代,c后面接字符串,取代n1,n2之间的行。
d:删除,
i:插入,插入的字符串在目标行的上一行出现。
p: 打印,选择某个行打印出来,通常与sed -n连用。打印固定行
s:取代,替换,通常与正则表达式连用, 例如 1,20s/old/new/g
字符串替换:
sed -n 's/root/zzzz/p' z.txt---------替换root为zzzz,并打印出来。如需全部替换,末尾加g
$ sed -n 's/root/XXXX/2p' z.txt----替换没行第二个root为,XXXX。
17,打印每行的第一个单词和第三个单词。
awk
awk是一个好用的数据处理工具!相比sed常常作用于一整行的处理,awk则比较倾向于一行当中分成<字段>来处理,语法如下
awk [Options] 'commands' filename
Options:
-F:指定字段的分隔符,默认的分割符是连续空格或制表符。
-v:定义变量并赋值
NF变量表示当前记录的字段数。
NR变量表示AWK读入的行数。
实例:
awk -F: '$3>=30 && $3<=40{print $1}' z.txt------------打印uid在30到40范围的用户名
awk -F: 'NR>=5 && NR<=10{print}' z.txt----------------打印5-10行
awk -F:'NR%2==1{print NR,$0}' z.txt ------------------打印奇数行
awk -F: 'NF>5{print NR,$0}' z.txt ------------------------打印字段数大于5的行
awk-f :'$3!=$4{print $1}' z.txt ----------------------------打印uid不等于gid的用户名