Awk and Sed
awk and sed is very useful when you processing text file. 图片来自QQ群,具体图片来自网络,版权归人家所有。可以看到图片右上角原作者的mail.两张图都是这个大牛画的。很不错。看不清的话右键在新的标签页打开就可以看到大的了,或者保存下来。
# 去重
$ awk '!a[$1]++'
# 合并重复行
$ awk '{key = $1; $1 = ""; a[key] = a[key] $0} END { for (key in a) print key, a[key] }' <<< cat tt.txt >tempfile
# 打印第一列之外的所有列
# 方法一:
$ awk '{for(iCnt=2;iCnt<=NF;iCnt++)print $iCnt}' urfile
# 方法二:
$ awk '{$1="";print $0}' filename
# 特定分隔符
$ awk -F ":" '{ print $1,$2 }' filename
# 直接修改文件本身
$ sed -i "s/origin/replace/g" filename
# 只在行中出现字串“baz”的情况下将“foo”替换成“bar”
$ sed '/baz/s/foo/bar/g'
# 不管是“scarlet”“ruby”还是“puce”,一律换成“red”
$ sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g' #对多数的sed都有效
$ gsed 's/scarlet\|ruby\|puce/red/g' # 只对GNU sed有效
# 将行中的字符逆序排列,第一个字成为最后一字,……(模拟“rev”)
$ sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
# 在每5行后增加一空白行 (在第5,10,15,20,等行后增加一空白行)
$ gsed '0~5G' # 只对GNU sed有效
$ sed 'n;n;n;n;G;' # 其他sed
# 显示文件中的前10行 (模拟“head”的行为)
$ sed 10q
# 显示文件中的第一行 (模拟“head -1”命令)
$ sed q
# 显示文件中的最后10行 (模拟“tail”)
$ sed -e :a -e '$q;N;11,$D;ba'
# 显示文件中的最后2行(模拟“tail -2”命令)
$ sed '$!N;$!D'
# 显示文件中的最后一行(模拟“tail -1”)
$ sed '$!d' # 方法1
$ sed -n '$p' # 方法2
# 显示文件中的倒数第二行
$ sed -e '$!{h;d;}' -e x # 当文件中只有一行时,输入空行
$ sed -e '1{$q;}' -e '$!{h;d;}' -e x # 当文件中只有一行时,显示该行
$ sed -e '1{$d;}' -e '$!{h;d;}' -e x # 当文件中只有一行时,不输出
# 只显示匹配正则表达式的行(模拟“grep”)
$ sed -n '/regexp/p' # 方法1
$ sed '/regexp/!d' # 方法2
# 只显示“不”匹配正则表达式的行(模拟“grep -v”)
$ sed -n '/regexp/!p' # 方法1,与前面的命令相对应
$ sed '/regexp/d' # 方法2,类似的语法
# 查找“regexp”并将匹配行的上一行显示出来,但并不显示匹配行
$ sed -n '/regexp/{g;1!p;};h'
# 查找“regexp”并将匹配行的下一行显示出来,但并不显示匹配行
$ sed -n '/regexp/{n;p;}'
# 显示包含“regexp”的行及其前后行,并在第一行之前加上“regexp”所
# 在行的行号 (类似“grep -A1 -B1”)
$ sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h
# 显示包含“AAA”、“BBB”或“CCC”的行(任意次序)
$sed '/AAA/!d; /BBB/!d; /CCC/!d' # 字串的次序不影响结果
# 显示包含“AAA”、“BBB”和“CCC”的行(固定次序)
$ sed '/AAA.*BBB.*CCC/!d'
# 显示包含“AAA”“BBB”或“CCC”的行 (模拟“egrep”)
$ sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d # 多数sed
gsed '/AAA\|BBB\|CCC/!d' # 对GNU sed有效
# 显示包含“AAA”的段落 (段落间以空行分隔)
> HHsed v1.5 必须在“x;”后加入“G;”,接下来的3个脚本都是这样
$ sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'
# 显示包含“AAA”“BBB”和“CCC”三个字串的段落 (任意次序)
$ sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'
# 显示包含“AAA”、“BBB”、“CCC”三者中任一字串的段落 (任意次序)
$ sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
$ gsed '/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d' # 只对GNU sed有效
# 显示包含65个或以上字符的行
$ sed -n '/^.\{65\}/p'
# 显示包含65个以下字符的行
$ sed -n '/^.\{65\}/!p' # 方法1,与上面的脚本相对应
$sed '/^.\{65\}/d' # 方法2,更简便一点的方法
# 显示部分文本——从包含正则表达式的行开始到最后一行结束
$ sed -n '/regexp/,$p'
# 显示部分文本——指定行号范围(从第8至第12行,含8和12行)
$ sed -n '8,12p' # 方法1
$ sed '8,12!d' # 方法2
# 移除大部分的HTML标签(包括跨行标签)
$ sed -e :a -e 's/<[^>]*>//g;/</N;//ba'

Reference:
awk and sed (https://mega.nz/#!kF801SpD!lYWdf9tEHn4eJ2yufsCEScR-lBhDeK7oVKFZgaORZzA)
unix text processing (https://mega.nz/#!AJUCVJyS!v1rGJRCIC1ckpEZPBILZD-MK5DnLSWEb6TPcbAZoMkQ)
Linux Awk Picture (https://openload.co/f/mPuwMoDt_TE/linux_awk.png)
sed 1 line (http://sed.sourceforge.net/sed1line.txt)