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

你还可以使用 pipe(|) 结合多个搜索,它的意思是 “或者”,所以你可以这样做:
grep -E "boot|boots" sampler.log bootboots4、特殊字符如果你想搜索的是一个特殊字符,该怎么办?如果你想找到所有的直线,如果包含美元字符“$”,则不能执行 grep “ $ ” a_file,因为 '$' 将被解释为正则表达式,相反,你将得到所有的行,其中有任何作为行结束,即所有行 。解决方案是 “转义” 符号,所以您将使用
grep '$' sampler.log broken$tuff你还可以使用 “-F” 选项,它代表“固定字符串”或“快速”,因为它只搜索字符串,而不是正则表达式 。
5、更多的 regexp 的例子参考:
四、AWK由 Aho,Weinberger 和 Kernighan 创建的文本模式扫描和处理语言 。AWK非常复杂,所以这不是一个完整的指南,但应该给你一个知道什么 awk 可以做 。它使用起来比较简单,强烈建议使用 。
1、AWK 基础知识【Linux三剑客awk、grep、sed详解】awk 程序对输入文件的每一行进行操作 。它可以有一个可选的 BEGIN{ } 部分 在处理文件的任何内容之前执行的命令,然后主{ }部分运行在文件的每一行中,最后还有一个可选的END{ }部分操作将在后面执行文件读取完成:
BEGIN { …. initialization awk commands …}{ …. awk commands for each line of the file…}END { …. finalization awk commands …}对于输入文件的每一行,它会查看是否有任何模式匹配指令,在这种情况下它仅在与该模式匹配的行上运行,否则它在所有行上运行 。这些 'pattern-matching' 命令可以包含与 grep 一样的正则表达式 。a
wk 命令可以做一些非常复杂的数学和字符串操作,awk也支持关联阵列 。AWK 将每条线视为由多个字段组成,每个字段由“间隔符”分隔 。默认情况下,这是一个或多个空格字符,因此行:
this is a line of text包含6个字段 。在 awk 中,第一个字段称为 2,等等,全部行称为 $0 。字段分隔符由 awk 内部变量 FS 设置,因此如果您设置 FS= ": "则它将根据 ':' 的位置划分一行,这对于/etc/passwd 之类的文件很有用,其他有用的内部变量是 NR,即当前记录号(即行号) NF是当前行中字段的数量 。
AWK 可以对任何文件进行操作,包括 std-in,在这种情况下,它通常与 '|' 命令一起使用,例如,结合 grep 或其他命令 。例如,如果我列出当前目录中的所有文件
ls -l总用量 140-rw-r--r-- 1 root root 55121 1月3 17:03 combined_log_format.log-rw-r--r-- 1 root root 80644 1月3 17:03 combined_log_format_w_resp_time.log-rw-r--r-- 1 root root71 1月3 17:55 sampler.log我可以看到文件大小报告为3 列数据 。如果我想知道它们的总大小,这个目录中的文件我可以做:
ls -l | awk 'BEGIN {sum=0} {sum=sum+$5} END {print sum}'135836请注意,'print sum' 打印变量 sum 的值,因此如果 sum = 2 则 'print sum' 给出输出 '2' 而 'print $ sum' 将打印 '1' ,因为第二个字段包含值 '1'。
因此,会很简单编写一个可以计算平均值的和一列数字的标准偏差的 awk 命令 - 在主要内部积累 'sum_x' 和 'sum_x2' 部分,然后使用标准公式计算 END 部分的平均值和标准偏差 。AWK 支持('for' 和 'while')循环和分支(使用 'if ') 。
所以,如果你想修剪一个文件并且只在每个第 3 行操作,你可以这样做:
ls -l | awk '{for (i=1;i<3;i++) {getline}; print NR,$0}'3 -rw-r--r-- 1 root root 80644 1月3 17:03 combined_log_format_w_resp_time.log4 -rw-r--r-- 1 root root71 1月3 17:55 sampler.logfor 循环使用 “getline” 命令遍历文件,并且每隔3次才打印一行 。注意,由于文件的行数是4,不能被3整除,所以最后一个命令提前完成,所以最后的 “print $0” 命令打印第4行,你可以看到我们也打印了行,使用 NR 变量输出行号 。
2、AWK 模式匹配AWK 是一种面向行的语言 。首先是模式,然后是动作 。操作语句用{ and }括起来 。模式可能缺失,或者动作可能缺失,但是,当然不是都 。如果缺少模式,则对每个输入记录执行操作 。一个丢失的动作将打印整个记录 。
AWK 模式包括正则表达式(使用与“grep -E”相同的语法)和使用的组合特殊符号 “&&” 表示“逻辑AND ”,“||”表示“逻辑或”,“!” 的意思是“逻辑不” 。你也可以做关系模式、模式组、范围等 。


推荐阅读