sed和awk,是文本操作中比较繁琐的操作。可以操作:查询搜索、复制、剪切、拼接等等,是非常强大的文本处理工具。
sed:对行的操作
awk:对列的操作

1. sed常见操作

sed主要是对某一行进行操作,参数如下:

  • -n
  • -i
  • d
  • s
  • e
  • r
  • w
  • a

1.1 查找字符串-n

查找字符串,会将结果直接输出在控制台上,但是原有文件并不会修改

  1. sed -n "3p" test.log 表示从test.log中搜索出第3行,并输出第3
  2. sed -n "3,9p" test.log 表示从test.log中搜索出第3行到第9行,并输出第3行到第9行。
  3. sed -n "p;n" test.log 表示输出所有奇数行,n表示读入下一行数据
  4. sed -n "n;p" test.log 表示输出所有偶数行

以下命令需调整:

  1. sed -n 1,5{p;n}“ test.log 表示输出第1行到第5行的所有奇数行,包括第1行,第3行,第5
  2. sed -n '10, ${n;p}' test.log 表示输出从第10行开始的所有偶数行,包括第10行,12行,14行……,如果是空行也包括 (注意是单引号,双引号报错)
  3. sed -n '4,/INFO/p' test.log 输出从第4行到第一个出现“INFO”的行,比如第4行有INFO,第5930行有“INFO ,那么输出是第4行和第5行。
  4. sed -n '4, /INFO/=' test.log 输出从第4行到第一个出现字符串“INFO”的行号,等号(=)用来输出行号。

1.2 插入字符串-i

sed -i会直接在原文件中修改。mac与linux命令不完全相同。

  1. sed -i "2, 100d" test.log 删除文件test.log中的第2行到第100
  2. sed -i 's/oldstring/newstring/g' test.log 文件test.log中,字符串oldstring全部替换成oldstring,并修改test.log文件

1.3 删除字符串d

  1. nl命令用于计算文件的行数
  2. nl test.log | sed "10, 100d" 删除文件test.log中第10行到第100
  3. nl test.log | sed '/INFO/d' 删除包括字符串“INFO”的行
  4. nl test.log | sed 'INFO/! d' 删除不包括字符串“INFO”的行

1.4 替换字符串s

  1. sed 's/oldstring/newstring/g' test.log 表示文件test.log中,所有的oldstring替换成newstring
  2. sed '1,3s/oldstring/newstring' test.log 表示文件test.log中,第1行到第3行中,所有的oldstring替换成newstring

1.5 多点编辑e

1.6 从文件读r

1.7 从文件写w

1.8 追加命令a

2. 踩坑

2.1 sed -i的命令区别
macos和linux并不是完全一样。在mac下直接使用sed -i,可能会提示:extra characters at the end of p command 的错误。可以通过在-i后面增加一个空字符串。
其他的sed -n命令没有受到影响。

  1. sed -i "" "s/oldstring/newstring/g" test.txt

2.2 sed -n查找基数和偶数,可能有问题

  1. sed -n '1, 5{n;p}' test.txt # 查看偶数或基数方法,需调整