Linux下的sed和awk

  Linux shell编程之awk的用法
  1. awk的使用
  基本功能:在文件或字符串中基于指定规则浏览和抽取信息。awk抽取信息後,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件信息。
  调用方式:
  1. 命令行方式
  2. 将所有awk命令插入一个文件,并使awk程序可执行,然后使awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。
  3. 将所有的awk命令插入一个单独文件,然后调用。
  选项说明:-F 域符号 缺省为空格
  -f 指明awk脚本
  2. 模式和动作
  1. 任何awk语句都由模式和动作组成。在一个awk脚本中可能有许多语句。
  模式部分决定动作语句何时触发及触发事件。模式缺省为执行状态。
  处理即对数据进行的操作。
  2. 模式可以是任何条件语句或复合语句或正则表达式。
  3. 模式包括两个特殊字段BEGIN和END。
  域和记录
  域标识:$1,$2,…,$n。用逗号做域分隔。$0表示所有域。
  打印域或所有域:print命令
  注:当碰到awk错误时,可相应查找:
  1. 确保整个awk命令用单引号括起来
  2. 确保命令内所有引号成对出项
  3. 确保用花括号括起动作语句,用圆括号括起条件语句
  4. 不要忘记使用花括号
  条件操作符
  ~ 匹配正则表达式
  !~ 不匹配正则表达式
  内置变量:
  NF:每一条记录中域名数
  是将变量$PWD的返回值传入awk并显示其目录。
  可以利用NF获取文件名
  注:但这里指定域分隔符为/
  NR:记录个数


1).保存awk输出: #awk '{print $0}' myfile>newfile
2).使用tee,在输出到文件的同时输出到屏幕(利用管道'|')
     #awk '{print $0}' myfile |tee newfile
3).打印报告头,#awk 'BEGIN {print "hello,this is Title\n---------"}{print $0}' newfile
4).打印信息尾.#awk 'BEGIN{print $0} END {"end of file."}' myfile
5).匹配,如下若在myfile第二列中带有BROWN,则打印信息
     #awk '{if ($2~/BROWN/) print $0}' myfile
6).精确匹配,同上,只是将~改为==
7).不匹配,有时要浏览信息并抽取不匹配操作的记录,与~相反的符号是!,如下
#awk '$0 !~/BROWN/' myfile
8).比较
如小于: #awk 'if ($1<$2) print $1' myfile
9).设置大小写 #awk '[Gg]reen/' myfile
10).任意字符,表达式/^...a/意为前三个字符是任意字符
#awk '$1~/^...a/' myfile
11).或关系匹配,#awk '$0~/(YELLOW || RED)/' myfile
12).与:&& ,或:||
13).awk内置变量
<1>.要快速查看记录个数,应使用NR,如:#awk 'END {print NR}' myfile <2>.以下使用NF变量显示每一条读记录中有多少个域,并在END部份 打印输入文件名。#awk '{print NR,NF,$0} END {print FILENAME}' myfile
<3>. 判断并输出 . #awk '{if(NR>0 && $4~/BROWN/) print $0' myfile
14).可以设置输入域到域变量名。
15).域值比较操作。
   @1.在BEGIN中给变量名赋值。通常在BEGIN部分赋值是很有益的,可以在awk表达式进行改动时减少很大麻烦.
   @2.在关系操作中使用实际数值,使用关系操作时必须用括号括起来.
#awk '{if($6<27) print $0}' myfile
#awk 'BEGIN {BASELINE="27"}{if ($6<BASELINE) print $6}' myfile
17).修改数据域取值
当在awk中修改任何域时,重要的一点是实际的文件可修改,改动的是cache中的awk复本,awk会在变量NR或NF中反映出修改的痕迹。
#awk '{if($1=="M.TANS")$6=$6-1;print $6}' myfile
18).修改文本域
#awk '{if($1=="J.Troll")($1="J.L.Troll");print $1}' myfile
19).只显示修改记录
#awk '{if($1=="J.Troll"){$1="J.L.Troll";print $1}}' myfile
20).创建新的输出域
在awk中处理数据时,基于各域进行计算的创建新域是个好的习惯。如下示例:
#awk 'BEGIN{print "Name    Score\t"}if($6<$7){$8=$7-$6;print $8}' myfile
21).增加列值
#awk 'tot+=$6;END{print "Club Total point." tot}' myfile
22).使用模式打印文件名及其长度,放入变量tot中
#ls -l | awk'/^[^d]{print $9 "\t" $5}{tot+=$5} END {print "Total KB:tot"}'
23).awk内置的字符串函数
24).awk脚本文件

如以上的所述的诸多情况,这里只不过命令放在一个文件中,且该文件必须是!/bin/awk -f ,因为这样才会使这个文件可以自解释。否则将不能作用。为了容易分别,最好将文件带一个扩展名.awk,完成对文件的编写后,再利用chmod u+x使文件可以执行。

///

   以上只是我在实验中的一些情况,awk命令功能很强大,大家可以参考其它的一些手册去获得更清楚的说明

  Linux shell编程之sed用法
  1. 是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。
  2. 通过行号或正则表达式指定要改变的文本行
  3. sed不与初始文件打交道,而只与它的一个拷贝打交道,如果操作结果没有重定向到一个文件,那么将输出到屏幕。
  调用方式:
  a. 命令行方式
  b. 将sed命令插入脚本文件中,然后调用sed
  c. 将sed命令插入脚本文件中,使得脚本文件为可执行。
  保存sed输出
  重定向到一个新文件 >
  sed中定位文本的方式
  x 一行号
  x,y 行号范围
  /pattern/ 查询包含模式的行
  /pattern/pattern/ 查询包含两个模式的行
  /pattern/,x 在指定行号上查询匹配模式的行
  x,/pattern/ 通过行号和模式查询匹配行
  x,y! 查询不包含行号x,y的行
  sed编辑命令
  p 打印文本
  匹配元字符$前,必须使用反斜线\
  = 打印行号 使用-e选项
  如果既打印行号又打印匹配行,必须使用两个sed命令,并使用-e选项
  附加文本
  使用符号a\ ,可以指定文本一行或多行附加到指定行。若不指定文本放置位置位置,sed缺省放置在每一行后面。
  创建sed脚本文件
  创建脚本文件,第一行为:
  #!/bin/sed -f ----注 说明sed命令解释行。脚本在这一行查找sed以运行命令,这里定位在/bin
  插入文本:在指定行前面插入,它也只接受一个地址。
  删除文本:d
  替换命令用替换模式替换指定模式
  使用sed实现的一个重要功能是在另一个系统中下载的文件中剔除控制字符。
  1. 使用s/-*//g删除横线-----
  2. 使用/^$s/d删除空行
  3. 使用$d删除最后一行
  4. 使用1d删除第一行
  5. 使用awk{print $1}打印第一列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值