-
正则表达式
- 正则表达式是一个字符串,用来表示一个规则,用来描述或匹配符合此规则的结果;
- 在文本编辑中,正则表达式通常用来检索/替换符合某个模式的文本内容;
- 常用的正则表达式工具grep,sed,awk
-
grep检索
grep [-option] 文件名 -c:打印符合要求的行数 -i:忽略大小写 -n:带行号输出 -v:打印不符合要求的行 -A:例如-A2或-A 2,表示打印符合要求的行以及下面两行 -B:打印符合要求的行以及上面n行 -C:打印符合要求的行以及上面和下面的n行 -l:列出包含某些字符的文件名
参数ABC
输出行号
正则式
- [0-9] 即包含0到9数字
- [0-9a-zA-Z] 包含数字0到9,字母a到z和A到Z
- [^A-Z] 不包含字母A到Z
- [678] 包含6或7或8的,而非678
正则式+字符串
开头&结尾
- 在字符串中,^表示行的开始;
- 在字符串中,$表示行的结尾;
- 在字符串中,^$表示空行;
通配符
- 符号.代表任意一个字符;
- 符号*代表了0或多个*之前的字符;
- 符号.*表示任意字符,包括空行;
出现次数
- \为转义字符;
- '\{n1,n2\}'其中n1<n2,出现次数[n1,n2],若省略n2,则表示>=n1
-
sed
- grep只能实现查找,无法实现编辑;
- vim可实现查找替换,但无法输出到屏幕上;
- sed和awk可实现将替换文本输出到屏幕上;
- sed和awk都是流式编辑器,是对文档的行来操作的
打印行
- p字符实打印输出
- -n实现打印某行
sed -n 'x'p filename 打印第x行,x为任意数字,''可省略 sed -n '1,$'p filename 打印多行,'1,x'即第1到第x行,'1,$'表示整个文档 sed -n '/xxx/'p filename 打印包含xxx内容的行
特殊字符
- 在字符串中,^表示行的开始;
- 在字符串中,$表示行的结尾;
- 在字符串中,^$表示空行;
- 符号.代表任意一个字符;
- 符号*代表了0或多个*之前的字符;
- 符号.*表示任意字符,包括空行;
多个行为
- -e实现多个行为
sed -e '/xxx/'p -e '/xxx/'p ... -n filename
删除行
- d符号实现删除打印;
- 此结果只影响打印结果,不影响文件实际内容
sed 'x'd filename 删除第x行,然后输出结果 sed 'x,y'd filename 删除从第x行到第y行,然后输出结果 sed '/xxx/'d filename 删除能匹配到xxx内容的行,然后输出结果
替换
- s符号实现替换打印;
- g符号实现全局替换,否则,只替换匹配到的第一个;
- 此结果只影响输出结果,不影响文件实际内容
sed 'x,ys/xxx/yyy/g' filename 将第x到y行的字符xxx均替换为yyy并输出到屏幕 sed 's/xxx/yyy/g' filename 将整个文件的字符xxx均替换为yyy并输出到屏幕 sed 's@xxx@yyy@g' filename 符号/可使用@,#等符号代替,作用一样 sed 's/[0-9]//g' filename 将所有的数字删除(替换为空)并输出到屏幕 sed 's[0-9A-Za-z]//g' filename 将所有的数字和字母删除并输出到屏幕
位置互换
- 通过s符号实现位置互换;
- 通过s符号和&符号实现插入操作;
- 符号.*$与符号.*均代表整个文档,符号$代表空行;
- 此操作只改变输出结果,不改变文本源内容
sed 's/\(xxx\)\(.*\)\(yyy\)/\3\2\1/' filename 将字符xxx与yyy互换位置,其他保持不变; 其中\(\)为转义的小括号即(),符号.*表示任意多的任意字符,\3\2\1对应括号表示其位置; 基础语法:sed 's/互换的内容/位置顺序/' 文件名 sed 's/^.*$/xxx&/' filename 在文档每行的行首插入字符xxx; 等同:sed 's/.*/xxx&/' filename sed 's/^$/xxx&/' filename 相当于在空行行首插入字符xxx 等同:sed 's/^$/xxx/' filename 即将空行替换为字符xxx sed 's/^.*$/&xxx/' filename 在文档每行的行末插入字符xxx; sed 's/^.*$/xxx/' filename 即将文档所有行的内容均替换为xxx; sed 's/^\(.\)\(.*\)\(.\)$/\3\2\1/' filename 即将文档每行的首字符与尾字符互换位置 sed 's/^\(.*\):\(.*\):\(.*\)$/\3:\2:\1/' filename 即以:为分割符,将首块和尾块互换位置
修改源文件
- 参数 -i 实现直接修改文件内容;
- 修改时不在屏幕打印修改结果;
- 因可直接修改文件,故一般在修改前先备份文件;
sed -i 's/:/,/g' filename 例:此语句可将文件实际内容修改,替换:为,写入
-
awk
- awk与sed一样为流式编辑器,即针对行进行操作,一行一行执行;
- awk比sed更强大,可实现sed的功能,也能做到sed无法做到的
打印
- -F 参数后面跟分割符,以''包括,缺省为tab;
- '{print $x,$y...}' 为输出方法,$x为分割出的第x块;
- 符号$0代表整行;
- 在print方法中,可加入想输出的字符,但需要使用"xxx"将其包括;
- 此操作不改变文件源内容
head -n2 filename | awk -F':' '{print $x}' 命令head截取文件前2行,在此两行中操作: 以:为分割符,打印被分割出的第x区域的内容,其中:根据实际需要选取分割符 awk -F':' '{print $x,$y,...}' 打印多个分区 awk -F':' '{print $0}' 打印整行,等同 awk '{print $0}' awk -F':' '{print $x"#"$y"aaa"$...}' 在各分区中插入向输入的字符,且必须使用"xxx"包括
匹配
- 符号~表示匹配的意思;
awk -F':' '$n~/xxx/' filename 通过:分割,第n区中匹配字符xxx,输出全行; awk -F':' '$n~/xxx/ {print $m}' filename 通过:分割,第n区中匹配字符xxx,输出m区; awk -F':' '/xxx/ {print $m} /yyy/ {print $n}' filename 通过:分割; 匹配到xxx的结果,打印其第m区,匹配到yyy的结果,打印其第n区,并顺序输出.
条件操作
- 逻辑比较符号 ==,!=,>,>=,<,<=
- 匹配结果均为字符或字符串,无数字,故为ascii码的比较
- 逻辑运算符号 &&,||
内置变量
- NF:用分割符分割后的段数;
- NR:行数
awk '{print NR}' filename 打印文件行数 awk -F':' '{print NF}' filename 打印分割段数
数学运算