正则表达式和文本搜索

正则表达式和文本搜索

  • 元字符
    • .匹配除换行符以外的任意单个字符
    • *匹配任意一个跟在它前面的字符
    • []匹配方括号中的字符类中的任意一个
    • ^匹配开头
    • $匹配结尾
    • \转义后面的特殊字符
  • 扩展元字符
    • +匹配前面的正则表达式至少一次
    • ?匹配前面的正则表达式出现零次或一次
    • |匹配前面或后面的正则表达式
  • 文件查找命令 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分组

  • 寻址可以匹配多条命令
  • /regular/

sed脚本文件

  • 可以将选项保存为文件,使用-f加载脚本文件
  • sed -f sedscript filename

sed其他指令

  • 删除命令
    • [寻址]d,寻址可以是行号或正则,也可以是混合
      • 删除模式空间内容,改变脚本的控制流,读取新的输入行,d后的任何指令都不会执行
  • 追加、插入、更改
    • 追加命令a,下一行插入
      • sed '/ab/a hello' bfile
    • 插入命令i,上一行插入
      • sed '/ab/i hello' bfile
    • 更改命令c, 把这一行改写成
      • sed '/ab/c hello' bfile
  • 打印
    • =打印行号
    • 打印命令p
      • sed '/ab/p' bfile
  • 下一行
    • n 下一行指令
  • 读文件和写文件
    • r读取文件
      • sed '/ab/r afile' bfile
    • w写入文件
      • sed '/ab/w afile' bfile
  • 退出命令
    • 退出命令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交换模式空间和保持空间内容
posted @ 2022-09-17 12:06  phper-liunian  阅读(200)  评论(0编辑  收藏  举报