「Linux」:sed, awk, grep, & ...

「Linux」工具的使用

流编辑器——sed

工作流

  • 读取: sed 从输入流(文件,管道或者标准输入)中读取一行并且存储到一个叫作 模式空间(pattern buffer) 的内部缓冲区
  • 执行:默认下,sed 命令在模式空间顺序执行(未指定行时,对所有的行执行)
  • 显示:将写改后的内容发送到输出流,模式空间清空

默认情况下,在模式空间执行命令,输入文件不会发生变化

存在一个持久存储的缓冲区 保持空间(hold buffer),可以用来临时保存内容

基础语法

总体结构: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

sed [-n] [-e] 'script(s)' files 
sed [-n] -f scriptfile files

OPTIONS

  • -n--quite,不打印模式空间的内容除非 -p
  • -e SCRIPT--expression=SCRIPT 指定执行脚本
  • -f SCRIPT-FILE--file=SCRIPT-FILE 指定执行的脚本文件
  • -i[SUFFIX]--in-place[=SUFFIX] 就地编辑,并以 SUFFIX 为后缀备份原文件
  • --follow-symlinks:处理符号链接
  • -E-r--regexp-extended 使用拓展正则(默认是基础正则)
  • -s--separate 合并输出的多个文件为一个流

sed command

总体结构 [addr]X[options]

addr 可选的标识行的地址,如行号、正则、范围

  • 3 第三行
  • 3,7 第 3-7 行
  • /^##/## 开头的行
  • /X$/X 结尾的行
  • $ 最后一行

X[options] 是一个动作及其选项,只对 addr 匹配的行进行处理

  • a [opts] 在当前行下方新增内容
  • p 打印模式空间的行
  • d 删除
  • c [opts] 取代
  • i [opts] 在当前行的上方插入内容
  • s [opts] 使用正则替换 opts <- /REGEXP/REPLACEMENT/[FLAGS]
    • REGEXP 正则表达式,匹配的内容会被 REPLACEMENT 替换
    • REPLACEMENT
      • string 直接替换
      • \N 引用匹配分组的内容 N <- [0..9]
      • & 引用整个匹配内容
      • \L | \l 将后面的内容转为小写,直到遇到 \U\E 结束 | \l 只转换第一个字符
      • \U | \u 将后面的内容转为大写,直到遇到 \L\E 结束 | \u 只转换第一个字符
      • \E 结束\L \U的转换
    • FLAGS
      • g 全局替换
      • p 打印
      • = 打印行号
  • y [opts] 转换 opts <- /src/dst
  • q [opts] 退出,opts 时返回值

循环

分支

保持空间

示例

# 在所有非 # 开头的行加上 #
sed -r 's/^([^#])/#\1/'

# 输出文件行数
sed -n -e '$='

# 移除空行
sed '/^$/d'

# 删除连续行
sed '/./,/^$/!d'

参考资料: sed 完全教程 三十分钟学会 sed

文本处理工具——awk

awk 这个名字来源于它的三个开发者的姓名首字母

一般来讲,Linux 上使用的是 GNU awk 即 gawk

基础语法

awk [options] '[Pattern]{Action}' /path/to/file1 [path/to/file2]

xxx | awk [opts] '[Pattern]{Action}'

举例

ll | awk '{print $NF}'
ll | awk '{print $0}'
ll | awk '{print $3}'
#linux
0%