grep、awk、sed区别
- grep数据查找定位
- awk数据切片
- 数据修改
数据准备
- 创建文件
mkdir test cd test touch test_grep_awk_sed.json
- 添加数据
{ "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
- 参数详解
-i 忽略大小写 -v 不显示匹配的行 -o 把每个匹配的内容用独立的行显示 -E 使用扩展正则表达式 -A [num] 打印匹配的内容至其后第num行 -B [num] 打印从匹配的内容起至其前第num行 -C [num] 打印匹配内容的前和后num行 -pattern -r dir/ 递归搜索
- 使用
-
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 {这里面放的是处理完所有的行后要执行的语句 }
- 变量
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'