正则表达式和文本搜索
- 元字符
.
匹配除换行符以外的任意单个字符
*
匹配任意一个跟在它前面的字符
[]
匹配方括号中的字符类中的任意一个
^
匹配开头
$
匹配结尾
\
转义后面的特殊字符
- 扩展元字符
+
匹配前面的正则表达式至少一次
?
匹配前面的正则表达式出现零次或一次
|
匹配前面或后面的正则表达式
- 文件查找命令 find
find /etc -name passwd
find /etc -name pass*
find /etc -regex .*wd
find /etc -type f -regex .*wd
find /etc -atime 8
find /etc -user root
touch /tmp/{1..9}.txt
find /tmp/*.txt -exec rm -v {} \;
find /tmp/*.txt -ok rm -v {} \;
- 文本内容的过滤(查找) grep
grep pass /root/anaconda-ks.cfg
grep pass /root/anaconda-ks.cfg | cut -d " " -f 1
cut -d ":" -f7 /etc/passwd
cut -d ":" -f7 /etc/passwd | sort | uniq -c | sort -r
sed与awk
- sed一般用于文本内容做替换
- awk一般用于对文本内容进行统计、按需要的歌手进行输出
sed模式空间
sed的基本工作方式
- 将文件已行为单位读取到内存(模式空间)
- 使用sed的每个脚本对该行进行操作
- 处理完成后输出改行
sed替换命令s
sed 's/old/new/' filename
sed -e 's/old/new/' -e 's/old/new/' filename ...
sed -i 's/old/new/' 's/old/new/' filename ...
带正则表达式的替换命令s
sed 's/正则表达式/new' filename
sed -r 's/扩展正则表达式/new/' filename
echo a a a > afile
sed 's/a/aa/ afile
sed 's!/!abc!' afile
sed -e 's/a/aa/' -e 's/aa/bb/' afile
# 合并多个替换命令
sed 's/a/aa/;s/aa/bb/' afile
# 查找多个文本
sed 's/a/aa/;s/aa/bb/' afile bfile cfile
# 把替换的文件写入到原始文件
sed -i 's/a/aa/;s/aa/bb/' afile
sed全局替换
sed 's/old/new/g' filename
g
为全局替换,用于替换所有出现的次数
- `head -5 /etc/passwd | sed 's/root/!!!!/g' 把root替换为4个!
/
如果和正则匹配的内容冲突可以使用其他符号,如
sed 's@old@new@g' filename
sed标识位
- 数字,第几次出现进行替换
- `head -5 /etc/passwd | sed 's/root/!!!!/2' 把第2个root替换为4个!
- g每次出现都替换
- p打印模式空间的内容,
head -5 /etc/passwd | sed 's/root/!!!!/p
匹配成功的模式会打印一次
- sed -n 'script' filename 阻止默认输出
head -5 /etc/passwd | sed -n 's/root/!!!!/p
只输出替换成功的行
- w file 将模式空间的内容写入到文件
head -5 /etc/passwd | sed -n 's/root/!!!!/w /tmp/a.txt
sed寻址
/正则表达式/s/old/new/g
head -5 /etc/passwd | sed '/^bin/s/nologin/!/
行号s/old/new/g
- 行号可以说具体的行,可以说最后一行$符号
head -5 /etc/passwd | sed '2s/adm/!/
head -5 /etc/passwd | sed '1,3s/adm/!/
head -5 /etc/passwd | sed '1,$s/adm/!/
- 可以使用两个寻址符号,也可以混合使用行号和正则地址
head -5 /etc/passwd | sed '/^bin/,$s/nologin/!/
sed分组
sed脚本文件
- 可以将选项保存为文件,使用-f加载脚本文件
- sed -f sedscript filename
sed其他指令
- 删除命令
- [寻址]d,寻址可以是行号或正则,也可以是混合
- 删除模式空间内容,改变脚本的控制流,读取新的输入行,d后的任何指令都不会执行
- 追加、插入、更改
- 追加命令a,下一行插入
- 插入命令i,上一行插入
- 更改命令c, 把这一行改写成
- 打印
- 下一行
- 读文件和写文件
- 退出命令
- 退出命令q
sed 10q filename
sed -n 1,10p filename
time sed -n '1,10p' filename
查看匹配1到10行运行的时间
sed的多行模式
- 多行模式处理命令N、D、P
- N将下一行加入到模式空间
sed 'N;s/hello/!!!/' a.txt
sed 'N;s/\n//;/s/hello bash/hello sed/\n;P;D' b.txt
- D删除模式空间中的第一个字符到第一个换行符
- P 打印模式空间中的第一个字符到第一个换行符
sed保持空间
- h和H将模式空间内容存放到保持空间
- g和G将保持空间取到模式空间
- x交换模式空间和保持空间内容