sed与awk

心已入冬 提交于 2020-01-27 13:19:44

sed擅长取行,awk命令擅长取列

sed

  • 格式sed <option> <script> <file>
    • file不指定则默认为STDIN

option

  • -e: 执行多个命令
    • 命令之间必须用分号隔开
    • 命令末尾和分号之间不能有空格
    • 例子:sed -e 's/brown/green/; s/dog/cat/' data.txt
  • -f: 从文件读取命令
    • 每个命令一行,无需分号
    • 例子:sed -f script.sed data.txt
  • -n:不产生命令输出,用p完成输出
  • -i: 直接修改文件中的数据
    • sed默认不会修改文件数据,而是把修改后的数据发送到STDOUT
    • -i.backup自动备份源文件

script

  • s 命令:用第二个斜线间的字符串替换第一个斜线间的匹配的模式(正则)

    • 格式:sed '[address] s/pattern/replace/[flag]'
    • 默认只替换每行第一处匹配的字符串
    • 替换标记(flag)
      • <数字>:第几处模式匹配的地方
      • g:替换所有匹配的文本
      • p:配合-noption只打印被修改过得行
        • sed -n 's/test/dev/p' in.txt
        • 也可以用来输出指定行
          • 输出3-6行:sed -n '3,6/p' in.txt
      • w <file>:把修改过得行写入文件,同时打印所有行(包括没修改的)
        • 可以用-noption不打印
        • 把2-6行输出到out.txt文件中:sed ‘2,6w out.txt’ in.txt
      • i: 匹配时忽略大小写
    • 默认的斜线分隔符不易处理路径,所以也可以用|^@!中任意一个当分隔符
      • 例子:sed 's!/bin/bash!/bin/sh!' /etc/passwd
    • 只替换选定行(address)
      • s前加数字区间即可
      • 只替换2,3行:sed '2,3 s/dog/cat/' in.txt
      • 从第2行开始替换后面的行:sed '2,$ s/dog/cat/' in.txt
      • 替换第2行以及后面3行:sed '2,+3 s/dog/cat/' in.txt
    • &: 当它用在替换字符串中的时候,代表的是原始的查找匹配数据
      • 把文件中的每一行,使用引号包围起来: sed 's/.*/"&"/' in.txt
  • d命令:删除匹配的内容

    • 如果没有-ioption,则只是不输出匹配的行
    • 删除第三行:sed -i ‘3 d’ in.txt
  • i命令:在匹配的行前增加新行

    • 格式:sed ‘[address] i\<new line>’ <file>
      • 注意是反斜杠
    • 在第二行前添加:sed ‘2 i\hello world’ in.txt
  • a命令:在匹配的行后增加新行

    • 在最后一行后添加:sed ‘$ a\hello world’ in.txt
  • c命令:替换行

    • 用一行替换3-5行:sed ‘3,5 c\hello world’ in.txt
  • y命令:转换单个字符

    • 格式:sed '[address] y/<inchars>/<outchars>/' <file>
      • 把inchars中字符转换为outchars对应的字符(多个一对一映射)
        • 因此长度必须相同
      • 所有inchars匹配到的字符都会转换
      • 例子:echo “12345” | sed ‘y/345/678/’
  • l命令:还原不可见字符

    • 例子:echo “a b” | sed -n ‘l’
      • 输出a\tb
  • r命令:读取文件中的数据并插入

    • 例子:sed -i '3 r data.txt' in.txt

sed与正则


常用例子

# 查看第5-7行和10-13行
sed -n -e '5,7 /p; 10,13 /p'
# 删除第3行并备份
sed -i.backup '3 d' 
# 删除空行
sed -i '/^$/d'

参考

awk

  • 格式awk <options> <program> <file>
    • file不指定则默认为STDIN

option

  • -f: 从文件读取命令
    • 必须以{}开头结尾
    • 每个命令一行,无需分号
  • -F: 自定义字段分隔符
    • 默认分隔符是空白符
    • 例子:awk -F: '{print $1}' /etc/passwd

program

  • 可以自定义变量

    • 引用自定义变量时不需要$
    • 默认变量
      • $0代表整个文本行
      • $1代表第1个数据字段
      • $n代表第n个数据字段
  • 关键字

    • BEGIN:在处理数据前执行后面定义的脚本
      • 两段命令仍需在同一单引号内
      • 例子:awk 'BEGIN {print "hello world!"} {print $0}'
    • END:在处理数据后执行后面定义的脚本
  • 在命令之间加分号可以执行多个命令

awk与正则


常用例子


参考

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!