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:

results matching ""

    No results matching ""