Linux三剑客awk、grep、sed详解( 三 )


3、AWK 控制语句if (condition) statement [ else statement ]while (condition) statementdo statement while (condition)for (expr1; expr2; expr3) statementfor (var in array) statementbreakcontinueexit [ expression ]4、AWK 输入/输出语句

Linux三剑客awk、grep、sed详解

文章插图
 
注意:printf 命令允许你使用类似 C 的语法更密切地指定输出格式 例如,你可以指定给定宽度的整数,浮点数或字符串等 。
5、AWK 数学函数
Linux三剑客awk、grep、sed详解

文章插图
 
6、AWK 字符串函数
Linux三剑客awk、grep、sed详解

文章插图
 
7、AWK 命令行和用法你可以根据需要多次使用 ' -v ' 标志将变量传递给 awk 程序,例如
awk -v skip=3 '{for (i=1;i<skip;i++) {getline}; print $0}' sampler.log boozebungiebroken$tuff你还可以使用编辑器编写 awk 程序,然后将其另存为脚本文件,例如:
$ cat awk_strip#!/usr/bin/awk -f#only print out every 3rd line of input fileBEGIN {skip=3}{for (i=1;i<skip;i++) {getline};print $0}然后可以将其用作新的附加命令
chmod u+x awk_strip./awk_strip sampler.dat五、sed = stream editorsed 对输入流(文件或来自管道的输入)执行基本文本转换单通过流,所以效率很高 。但是,sed 能够管道过滤文本,特别区别于其他类型的编辑器 。
1、sed 基础sed 可以在命令行或 shel l脚本中使用,以非交互方式编辑文件 。也许最有用的功能是对一个字符串进行 “搜索和替换” 到另一个字符串 。
您可以将 sed 命令嵌入到使用 '-e' 选项调用 sed 的命令行中,或者将它们放在一个单独的文件中 'sed.in' 并使用 '-f sed.in' 选项调用 sed 。后一种选择是如果 sed 命令很复杂并涉及大量regexp,则最常用! 例如:
sed -e 's/input/output/' sampler.log bootbookboozemachinebootsbungiebarkaardvarkbroken$tuffrobots将从 sampler.log 回显到标准输出的每一行,改变每一行的 'input' 排成 'output' 。注意 sed 是面向行的,所以如果你想改变每一行的每一个事件,那么你需要让它成为一个 '贪婪' 的搜索和替换,如下所示:
sed -e 's/input/output/g' sampler.log bootbookboozemachinebootsbungiebarkaardvarkbroken$tuffrobots/.../ 中的表达式可以是文字字符串或正则表达式 。注意默认情况下,输出将写入 stdout 。你可以将其重定向到新文件,或者如果你愿意 编辑现有文件,你应该使用 '-i' 标志:
sed -e 's/input/output/' sampler.log> new_filesed -i -e 's/input/output/' sampler.log2、sed 和正则表达式如果你希望在搜索命令中使用的某个字符是特殊符号,例如 '/',该怎么办?(例如在文件名中)或 '*' 等? 然后你必须像 grep(和awk)那样转义符号 。跟你说想要编辑shell脚本以引用 /usr/local/bin而不是 /bin,那么你可以这样做
sed -e 's//bin//usr/local/bin/' my_script > new_script如果你想在搜索中使用通配符怎么办 - 如何编写输出字符串? 你需要使用与找到的模式对应的特殊符号“&” 。所以说你想要每行以你的文件中的数字开头,并用括号括起该数字:
sed -e 's/[0-9]*/(&)/' 其中 [0-9] 是所有个位数的 regexp 范围,而 '*' 是重复计数,表示任何数字的位数 。你还可以在 regexp 中使用位置指令,甚至可以将部分匹配结果保存在模式缓冲区,以便在其他地方重用 。
六、其它 SED 命令一般形式是
sed -e '/pattern/ command' sampler.log其中 'pattern' 是正则表达式,'command' 可以是 's'= search&replace,或 'p'= print,或 'd'= delete,或 'i'=insert,或 'a'=Append 等 。
请注意,默认操作是打印所有不是无论如何匹配,所以如果你想抑制它,你需要使用 '-n' 标志调用 sed,然后你可以使用 'p' 命令来控制打印的内容 。
所以,如果你想做一个所有的列表 你可以使用的子目录
ls -l | sed -n -e '/^d/ p'因为长列表开始每行都带有 'd' 符号,如果它是一个目录,所以这只会打印出来那些以 'd' 符号开头的行 。同样,如果你想删除所有以评论符号 '#' 开头的行,你可以使用
sed -e '/^#/ d' sampler.log也可以使用范围表单


推荐阅读