awk 条件过滤

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了awk 条件过滤相关的知识,希望对你有一定的参考价值。

要求将时间去掉,其他的输出不一定有规律,也不一定是总和为:组播为什么等,这是个面试题
Wed Apr 4 09:30:02 CST 2012
总和为: 133
组播为: 131
点播为: 1
Wed Apr 4 10:00:01 CST 2012
总和为: 136
组播为: 128
点播为: 5
Wed Apr 4 10:30:01 CST 2012
总和为: 130
组播为: 123
点播为: 4
Wed Apr 4 11:00:01 CST 2012
总和为: 126
组播为: 124
点播为: 2
Wed Apr 4 11:30:02 CST 2012
总和为: 127
组播为: 123
点播为: 1
Wed Apr 4 12:00:02 CST 2012
总和为: 133
组播为: 124
点播为: 3
Wed Apr 4 12:30:01 CST 2012
总和为: 131
组播为: 123
点播为: 4
Wed Apr 4 13:00:01 CST 2012
总和为: 127
组播为: 122
点播为: 3

grep -vE "[0-9]1,2(\:[0-9]1,2)2" file

用正则把直接取时间固定格式 xx:xx:xx 时分秒 ,然后grep -E正则扩展,-v反匹配,这两个参数合起来用,就过滤到时间所在的行了,不能象他们那样过虑特定字符,万一字符变了呢?只有时间固定格式全球统一,绝不会变!
正则的含义:[0-9]的数字 1,2出现一到两次 (\:转译冒号[0-9]1,2即[0-9]的数字出现一到两次)然后小括号里的出现2次,这样就组合成了任意 小时,分钟和秒了。

给分吧~~

[yuechengjun@localhost ~]$ grep -vE "[0-9]1,2(\:[0-9]1,2)2" aaa
具体的源文件如下:
总和为: 133
组播为: 131
点播为: 1
总和为: 136
组播为: 128
点播为: 5
总和为: 130
组播为: 123
点播为: 4
总和为: 126
组播为: 124
点播为: 2
总和为: 127
组播为: 123
点播为: 1
总和为: 133
组播为: 124
点播为: 3
总和为: 131
组播为: 123
点播为: 4
总和为: 127
组播为: 122
点播为: 3
参考技术A sed -i 's/^.*CST.*$//g' file #把时间删掉
awk 'sub(/.*CST.*/,"");1' file #awk的

后边那句:
其他的输出不一定有规律,也不一定是总和为:组播为什么等

我没听懂说的什么意思。
参考技术B 先确认一下你的问题: 仅仅去掉时间戳相关的行,保留其他所有的行,而且其他的行不一定都是很有规律的, 是这样吗???

如果是这样的话,可以参考这个思路:以CST作为分隔符

gawk -W re-interval -F"CST" ' !(NF==2 && $2~/[0-9]4/)print $0'

-W re-interval : 表示开启区间元字符, 如 4
'!(express) print $0' : 不满足表达式的时候才输出

awk根据条件过滤文件

我使用下面的代码来过滤我的源文件。此代码包含多个gsub条件

但是这里的问题是由于多个gsub,脚本需要花费大量时间来执行和解析另一个文件中的数据。你能不能让我知道实现这些条件的其他方法,以便我的脚本可以更快地执行

awk -F"[        	]" -v OFS="|" '{gsub(/^[ 	]+|[ 	]+$/,"");gsub(/"/,"");gsub(/[[:blank:]]+|.|-/,"",$32);gsub(/[[:blank:]]+|.|-/,"",$13);gsub(/^[[:space:]]+|[[:spa
ce:]]+$|,/,"",$38);gsub(/^[[:space:]]+|[[:space:]]+$|,/,"",$42);gsub(/^[[:space:]]+|[[:space:]]+$|,/,"",$44);gsub(/^[[:space:]]+|[[:space:]]+$/,"",$27);gsub(/^[[:spa
ce:]]+|[[:space:]]+$/,"",$40);gsub(/^[[:blank:]]+|[[:blank:]]+$/,"",$18);

下面是相同的代码,但是为了便于阅读而切片(仅限可读性):

awk -F"[        	]" -v OFS="|" '{gsub(/^[ 	]+|[ 	]+$/,"");
                                  gsub(/"/,"");
                                  gsub(/[[:blank:]]+|.|-/,"",$32);
                                  gsub(/[[:blank:]]+|.|-/,"",$13);
                                  gsub(/^[[:space:]]+|[[:space:]]+$|,/,"",$38);
                                  gsub(/^[[:space:]]+|[[:space:]]+$|,/,"",$42);
                                  gsub(/^[[:space:]]+|[[:space:]]+$|,/,"",$44);
                                  gsub(/^[[:space:]]+|[[:space:]]+$/,"",$27);
                                  gsub(/^[[:space:]]+|[[:space:]]+$/,"",$40);
                                  gsub(/^[[:blank:]]+|[[:blank:]]+$/,"",$18);

如果需要输入文件,请告诉我,将分享

答案

这不是答案,而是代码的可读版本:

awk -F"[        	]" -v OFS="|" '
  { gsub(/^[ 	]+|[ 	]+$/,"");
    gsub(/"/,"");  
    gsub(/[[:blank:]]+|.|-/,"",$32);
    gsub(/[[:blank:]]+|.|-/,"",$13);
    gsub(/^[[:space:]]+|[[:space:]]+$|,/,"",$38);
    gsub(/^[[:space:]]+|[[:space:]]+$|,/,"",$42);
    gsub(/^[[:space:]]+|[[:space:]]+$|,/,"",$44);
    gsub(/^[[:space:]]+|[[:space:]]+$/,"",$27);
    gsub(/^[[:space:]]+|[[:space:]]+$/,"",$40);
    gsub(/^[[:blank:]]+|[[:blank:]]+$/,"",$18);
  }' # closing brace and quote were probably missing

以上是关于awk 条件过滤的主要内容,如果未能解决你的问题,请参考以下文章

awk

Linux命令操作:用sort和awk命令,进行复杂条件过滤

linux-AWK

linux三剑客之awk

fiddler 按条件过滤

使用grep命令怎么过滤多个条件