文本三剑客

grep

grep(global regular expression print),适用于查找匹配文本,支持基础正则表达式,扩展的正则表达式需要增加 -E 选项或使用 egrep 命令。

1. 命令格式

DANGER

grep [选项…] patterns 文件

2. 常用选项

选项含义
-c统计匹配的行数。
-i忽略模式中的字母大小写。
-v取反,列出没有匹配到的。
-w匹配整个单词。
-n显示匹配的行号。
-E扩展正则表达式。
-o仅输出文件中匹配到的部分。

3. 示例

  • 取出存在 name 的行:

    grep name package.json
    
  • 取出没有 name 的行并显示行号:

    grep -vn name package.json
    
  • 获取文件中出现 docs 的次数:

    grep -o docs package.json | grep -c docs
    # or
    grep -o docs package.json | wc -l
    

sed(行)

sed(stream edit 流编辑器),就类似于 vim,可快速实现对文件的增删改查。区别是 vim 还需要交互操作,而 sed 可以预置一组规则。

1. 命令格式

DANGER

sed [选项…] [内置命令] 文件

2. 常用选项

选项含义
-n取消 sed 的默认输出(仅输出自己想要的)。
-i直接修改文件的内容,而非输出到终端。
-e脚本命令。
-f脚本文件命令。

3. 内置命令

命令含义
aappend,表示追加文本。
ddelete,表示匹配行的文本。
iinsert,表示插入文本。
pprint,表示打印匹配行的内容。
s匹配 regexp 部分内容,使用 replacement 替换 regexp 匹配的内容。

4. 示例

  • 替换文本中的 docs 为 hello:

    sed 's/docs/hello/g' package.json
    
  • 删除所有含有 @ 的行:

    sed '/@/'d package.json
    
  • 输出 20 - 23 行的内容:

    head -23 package.json | tail -3
    # or
    sed -n '20,23p' package.json
    
  • 修改 20 -23 行中 bugs 为 features:

    sed '2,3s/bugs/features/' package.json
    
  • 在第 5 行追加 hello world:

    sed '5a hello world' package.json
    
  • 输出第 5 行到第一个包含 docs 行之间的所有行:

    sed -n '5,/docs/p' package.json
    
  • 输出 5 - 10 行的内容到新的文件中:

    sed -n '5,10w test.txt' package.json
    cat test.txt # 验证
    

awk(列)

awk(Aho、Weingberger、Kernighan 三人姓名) 是一种编程语言,适用于处理数据和生成报告,进行更为复杂的处理。可以顺带了解下 cut。

awk 会自动给一行中的每个数据元素分配一个变量,默认情况下:

  • $0:代表整个文本行;
  • $1:代表文本行中的第 1 个数据字段;
  • $2:代表文本行中的第 2 个数据字段;
  • $n:代表文本行中的第 n 个数据字段;
  • $NF:代表文本行中的最后一个数据字段;
  • $(NF-1):代表文本行中的倒数第二个数据字段。

1. 命令格式

DANGER

awk [选项…] pattern{action} 文件

DANGER

awk 'BEGIN{ commands } pattern{ commands } END{ commands }'

2. 常用选项

选项含义
-F指定分隔符。
-f指定脚本文件。
-v在处理过程之前,初始化变量。

3. 示例

了解其基本使用即可。

  • 输出第一列内容:

    sed -n '1,5p' /etc/passwd | awk -F ":" '{print $1}'
    
  • 使用变量:

    echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }'
    
  • 输出 20 - 23 行的行号及内容:

    awk 'NR>19&&NR<24 {print NR,$0}' package.json
    # or
    awk 'NR=20,NR=21,NR=22,NR=23 {print NR,$0}' package.json
    
  • 输出含有 docs 的行:

    awk '/docs/' package.json