Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1351192
  • 博文数量: 632
  • 博客积分: 2778
  • 博客等级: 大尉
  • 技术积分: 3387
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 09:09
个人简介

123

文章分类

全部博文(632)

文章存档

2014年(36)

2013年(33)

2012年(563)

分类: LINUX

2013-07-09 12:08:02

原文地址:awk && sed 学习记录 作者:kycy624

AWK实例:

点击(此处)折叠或打开

  1. 特殊变量: RS ORS FS OFS NR NF
  2. RS -- 记录分隔符,默认的分隔符是\n
  3. ORS -- 记录输出分隔符,默认的分隔符是\n
  4. FS -- 指定列分隔符
  5. OFS -- 列输出分隔符
  6. NR -- 记录行数
  7. NF -- 列的总个数
  8. --------------------------------------------------------------------------------
  9. ifconfig eth0 | awk -F'[ |:]+' 'NR==2 {print $4}' #获取eth0的IP地址
  10. ifconfig eth0 | awk 'BEGIN{FS="[ |:]+"} NR==2 {print $4}' #效果与上面一样
  11. --------------------------------------------------------------------------------
  12. awk '/^$/ {x++} {print x}' test.txt #获取test.txt文件中空行的数目
  13. --------------------------------------------------------------------------------
  14. echo "AAA BBB CCC" | awk 'BEGIN{OFS=":"} {print $1,$2,$3}' #已分隔符:,输出内容,输出结果为 AAA:BBB:CCC。 重点为OFS定义输出分隔符
  15. echo "AAA BBB CCC" | awk 'BEGIN{OFS=":"} {NF=NF;print $0}' #其结果与上面一样,只是在很多字段的时候这样更方便快捷。
  16. --------------------------------------------------------------------------------
  17. awk '{if($2==222 && $3=="AAA") print $0}' test.txt #多个字段匹配输出
  18. awk '{if($2~/^222$/ && $3~/^eee$/)print $0}' test.txt
  19. --------------------------------------------------------------------------------
  20. awk '{if($2 == 222) print "ok"; else if($2==333) print "error"}' test.txt #多条件判断
  21. awk '{($2 == 222) ? name="ok" : name="error";print name}' test.txt #if ...else可以采用 ? :方式
  22. --------------------------------------------------------------------------------
  23. awk 'BEGIN{i=1;while(i<=4) {print i;++i;}}'   #while循环,打印1-4
  24. seq 1 10 | awk '{while($0~7){print $0;exit}}'  #匹配7输出
  25. awk 'BEGIN{do{++x;print x}while(x<=4)}'   #do ... while 循环: 此处输出1..5
  26. awk 'BEGIN{for(i=1;i<=5;i++) print i}'            #for循环
  27. awk '{++name[$NF]}END{for(n in name)print n,name[n]}' test.txt   #打印每行记录出现的次数
  28. netstat -an | awk '/^tcp/ {++state[$NF]}END{for(n in state) print n,state[n]}'  #打印主机网络连接各种状态数据
  29. awk '{$1=NULL;print $0}' test.file    #对于不打印某列,我们可以指定其值为空(null)


SED实例

点击(此处)折叠或打开

  1. 快速删除文本中空行
  2. sed -i -n 'L' text.txt
  3. echo -e "aaa\nAAA\nEEE" | sed -n '/EEE/=;' #打印EEE在那一行,关键参数"="
  4. echo -e "aaa\nAAA" | sed -n 's/a/Y/igp' #不区分大小写把a或A替换为Y;
  5. echo "hello world" | sed 's/ */ /g' #删除字符间多个空格(由多个变为一个),*前面为两个空格
  6. echo " this is a test message " | sed 's/^ *//g;s/ *$//g' #删除行前行尾空格
  7. echo "/usr/local/python" | sed 's#/usr/local#/opt#g' #替换命令,默认使用/作为定界符,如果需要匹配的字符中包括/,则我们可以选择其他符号作为定界符。比如:! #等
  8. echo "AAA:BBB:CCC:DDD" | sed 's/:/>/g' #替换所有:为>
  9. #以下分别把第一次、二次、三次出现:替换为>。
  10. echo "AAA:BBB:CCC:DDD" | sed 's/:/>/1'
  11. echo "AAA:BBB:CCC:DDD" | sed 's/:/>/2'
  12. echo "AAA:BBB:CCC:DDD" | sed 's/:/>/3'
  13. #回调匹配内容
  14. echo -e "one:two\nfirst:second" | sed 's/\(.*\):\(.*\)/\2:\1/' #此处\1表示匹配第一个括号中内容,\2表示匹配第二个括号中内容。
  15. df -h | sed -n '/sda/ s/M/MB/gp' #匹配替换,并单独输出匹配的那一行。

  16. --------------------------------------------------------------------------------
  17. SED追加、插入与更改:
  18. \i 插入命令将所提供的文本放置在模式空间的当前行之前
  19. \a 追加命令将所提供的文本放置在模式空间的当前行之后
  20. \c 更改命令将所提供的文本取代模式空间的内容。(支持多行)

  21. 以下法子只限与文本中没匹配以A开头的多行
  22. echo -e "AAA\nBBB" | sed '2i\\' #在AAA、BBB之间插入一空行
  23. --------------------------------------------------------------------------------
  24. sed n命令:
  25. sed -n '/111/{n;/^A/p}' 1.txt
  26. 首先找到匹配111的行,然后跳到匹配行的下一行,如果如果此行匹配以A开头,则打印出来
  27. sed 'n;d' 1.txt #删除偶数行
  28. 实例一: 当空行跟随一个匹配模式的行时,则删除该空行
  29. 【如果空行跟在匹配1111的下面则删除此空行】
  30. 【如果匹配的1111在匹配的AAAA下两行,则删除匹配1111的行】

  31. --------------------------------------------------------------------------------
  32. 高级SED
  33. 处理了多行模式空间(N,D,P)
  34. 采用保持空间来保存模式空间的内容并使它可用于后续的命令(H,h,G,g,x).
  35. 编写使用分支和条件指令的脚本来更改控制流(:、b、t)
  36. ----------------------------
  37. p,P对比测试:
  38. p【打印模板块的行】
  39. P【打印模板块的第一行】
  40. ----------------------------
  41. n,N 对比测试:
  42. d,D对比测试:
  43. 将多个空行减少到一行:
  44. 采用保持空间来保存模式空间的内容并使它可用于后续的命令(H,h,G,g,x).
  45. Hold 【h,H 将模式空间的数据复制或追加到保持空间】
  46. Get 【g,G 将保持空间的数据复制或追加到模式空间】
  47. Exchange 【x 交换保持空间和模式空间的内容】
  48. 同一命令的大小写字母的区别是:小写字母命令改写目的缓存区的内容,而大写字母命令追加缓存区的现有内容。
  49. --------------------------------------------------------------------------------
  50. 实例:
  51. sed G test.file #在每行后面加入一空行
  52. sed '/^$/d;G' test.file #在每个非空行的后面加入一空行。G;G;代表两个空行
  53. sed 'n;G' test.file #在文件偶数行后面加入空行
  54. 替换位置:
  55. 首先通过h命令将第一行复制到保持空间,在执行d命令清除模式空间。然后将第二行读入到模式空间,并且将保持空间的行追加到
  56. 模式空间的结尾.
  57. y 【大小写】
  58. echo "hello held" | sed 'y/h/H/'
  59. echo "Hello Held" | sed 'y/H/h/'
  60. --------------------------------------------------------------------------------
  61. 高级流控制
  62. 分支(b)与测试(t)
  63. 以下命令解释: 如果匹配root则跳到标签there (:there),执行:there后面的语句:/root/ s/G/GB/g
  64. 不匹配的话就执行s/M/MB/g语句



阅读(860) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~