Linux三剑客,grep、awk、sed

437 阅读3分钟

三剑客参考文献

三剑客进阶

grep、awk、sed区别

  1. grep数据查找定位
  2. awk数据切片
  3. 数据修改

数据准备

  1. 创建文件
    mkdir test
    cd test
    touch test_grep_awk_sed.json
    
  2. 添加数据
    {
    "data": {
      "list": [
        {
          "id": 1,
          "name": "PYTHON小课",
          "english_name": "pyclass"
        },
        {
          "id": 2,
          "name": "python训练营",
          "english_name": "python_trainingcamp"
        },
        {
          "id": 3,
          "name": "python学习营",
          "english_name": "readcp"
        },
        {
          "id": 4,
          "name": "python天天学",
          "english_name": "pyclass_study_system"
        }
      ]
    },
    "errcode": 0,
    "errmsg": "ok"
    }
    

grep

  1. 参数详解
    -i 忽略大小写
    -v 不显示匹配的行
    -o 把每个匹配的内容用独立的行显示
    -E 使用扩展正则表达式
    -A [num] 打印匹配的内容至其后第num行
    -B [num] 打印从匹配的内容起至其前第num行
    -C [num] 打印匹配内容的前和后num行
    -pattern -r dir/ 递归搜索
    
  2. 使用
    • grep -i python test_grep_awk_sed.json(搜索包含python的行且忽略大小写)

    • grep -v python test_grep_awk_sed.json(不显示含有python的行)

    • grep -o python test_grep_awk_sed.json (分行打印匹配的内容)

    • grep -E "py*" test_grep_awk_sed.json(正则匹配包含py的内容)

    • grep -B 1 python test_grep_awk_sed.json (匹配python字符串及其后一行内容)

    • grep -A 1 python test_grep_awk_sed.json(匹配python字符串及其前一行内容)

    • grep -C 1 python test_grep_awk_sed.json(匹配python字符串及其前后一行内容)

awk

1.语法

- 正则匹配:awk '/pattern/' 
    eg:搜索t.txt文件中文本name, cat t.txt | awk '/name/' 

- 区间选择:awk '/aa/,/bb/'
    eg: seq 20 | awk '/12/,/18/' 搜索序列1-20中数值大小在12到18之间的数
    
- 取特定行:awk 'NR==2' 取第二行
- 取大于第n行:awk 'NR>$n'
- 开始和结束:awk 'BEGIN{}END{}'
    - BEGIN{ 这里面放的是执行前的语句 }
    - END {这里面放的是处理完所有的行后要执行的语句 }
  1. 变量
FS:字段分隔符
OFS: 输出数据的字段分隔符
RS: 记录分隔符
ORS: 输出字段的行分隔符
NF: 字段数
NR:记录数

1023  seq 10 | awk '/^..$/'
1024  seq 10 | awk '/^5$/'
1025  seq 10 | awk '/^1$/'
1026  seq 10
1027  seq 20
1028  seq 20 | awk '/[5-9]/'
1029  seq 20 | awk '/[15-19]/'
1030  seq 20 | awk '3,4'
1031  seq 20 | awk '/15/,//19'
1032  seq 20 | awk '/15/,/19/'
1033  seq 20 | awk 'NR=1'
1034  seq 20 | awk 'NR==1'
1035  seq 20 | awk 'NR==2'
1036  seq 20 | awk 'NR==10'
1037  pwd
1038  echo '1|2'
1039  echo '1|2#3_4'
1040  echo '1|2#3_4' | awk -F '#|_' '{print $4}'
1041  echo '1|2#3_4' | awk -F '#|_' '{print $NF}'
1042  echo '1|2#3_4' | awk -F '#|_' '{print $3}'
1043  echo '1|2#3_4' | awk -F '#|_' '{print $2}'
1044  echo '1|2#3_4' | awk -F '#|_' '{print $1}'
1045  echo '1|2#3_4' | awk -F '#|_|' '{print $1}'
1047  echo '1|2#3_4' | awk -F '#|_|\\|' '{print $1}' // 将分隔符'# and _ and / ' 对字符串进行切割,取出第一个数
1048  echo '1|2#3_4' | awk -F '#|_|\\|' '{print $2}'
1049  echo '1|2#3_4' | awk -F '#|_|\\|' '{print $3}'
1050  echo '1|2#3_4' | awk -F '#|_|\\|' '{print $4}'
1051  echo '1|2#3_4' | awk 'BEGIN{FS="#|_|\\|"}{print $4}'
1052  echo '1|2#3_4' | awk 'BEGIN{FS="#|_|\\|"}{print $1}'
1053  echo '1|2#3_4' | awk 'BEGIN{FS="#|_|\\|";OFS=" "}{print $1}'
1054  echo '1|2#3_4' | awk 'BEGIN{FS="#|_|\\|";OFS=" "}{print $0}'
1055  echo '1|2#3_4' | awk 'BEGIN{FS="#|_|\\|";OFS=" ";}{print $0}'
1056  echo '1|2#3_4' | awk 'BEGIN{FS="#|_|\\|";OFS=" ";}{print $1}'
1057  echo '1|2#3_4' | awk 'BEGIN{FS="#|_|\\|";OFS=" ";}{print $1,$2,$3,$4}'
1058  echo '1|2#3_4' | awk 'BEGIN{FS="#|_|\\|";}{print $1,$2,$3,$4}'
1059  echo '1|2#3_4' | awk 'BEGIN{FS="#|_|\\|";OFS=" "}{print $1,$2,$3,$4}'
1060  echo '1|2#3_4' | awk 'BEGIN{FS="#|_|\\|";OFS="_"}{print $1,$2,$3,$4}'
1061  echo '1|2#3_4' | awk 'BEGIN{FS="#|_|\\|";OFS="_"}{print $0}'
1062  echo '1|2#3_4' | awk 'BEGIN{FS="#|_|\\|";OFS="_"}{print $1,$2,$3,$4}'
1063  echo '1|2#3_4' | awk 'BEGIN{RS="#|_|\\|";OFS="_";}{print $1,$2,$3,$4}'
1064  echo '1|2#3_4' | awk 'BEGIN{RS="#|_|\\|";OFS="_";}{print $1}'
1065  echo '1|2#3_4' | awk 'BEGIN{RS="#|_|\\|";}{print $1}'
1066  echo '1|2#3_4' | awk 'BEGIN{RS="#|_|\\|";ORS="_"}{print $1}'
1067  echo $PATH
1068  echo $PATH | awk 'BEGIN{RS=":"}'
1069  echo $PATH | awk 'BEGIN{RS=":"}{print $0}'

sed

  • 字符串替换
    将`hello,小明`更改为`hello,小红`,下面例子只会替换找到的第一个匹配的字符串
    echo "hello,小明" | sed 's/小明/小红/'
    
    将匹配的字符串全部替换
    echo "hello,小明小明" | sed 's/小明/小红/g'