【问题标题】:Ignore grep -v not query when empty pattern is passed?传递空模式时忽略grep -v不查询?
【发布时间】:2018-02-22 01:25:47
【问题描述】:

我有一段代码可以正常工作,但我想要一个不同的结果。假设$query_value$not_query_valueempty

`sed -n "$dateRange" $error_log_file_name|egrep -i "($query_value)"|grep -E -i -v "($not_query_value)"|head -n $first_few_lines_value>>$extracted_log_path_value` 

sed 的输出被传递给 grep。 grep 返回所有内容,grep -V 在传递空模式时不返回任何内容。我的愿望是当empty 模式被传递给它时,grep -V 应该像grep 一样。我可以通过检查是否没有将空模式传递给 grep -V 来通过if,else 条件来实现它。但我不想提供任何检查点。如果没有提供$not_query_value,有没有办法可以忽略grep -V

输入样本是 -

sed -n '/2018-02-19 00:0[0-9]/,/2018-02-19 23:59/p' "/var/opt/MarkLogic/Logs/ErrorLog_2.txt"|egrep -i "()"|grep -E -i -v "()"|head -n $first_few_lines_value>>$extracted_log_path_value;

什么都不返回。预期的输出将是大量的日志文件,例如 -

> 2018-02-19 00:01:03.668 Info: Merged 26 MB in 1 sec at 19 MB/sec to
> /var/opt//Forests/Meters/000059de 2018-02-19 00:01:06.046 Info:
> Deleted 20 MB at 7321 MB/sec /var/opt//Forests/Meters/000059db
> 2018-02-19 00:01:06.050 Info: Deleted 6 MB at 1546 MB/sec
> /var/opt//Forests/Meters/000059da 2018-02-19 00:01:06.054 Info:
> Deleted 7 MB at 1988 MB/sec /var/opt//Forests/Meters/000059dc
> 2018-02-19 00:10:00.406 Info: Saving /var/opt//Forests/Meters/000059dd
> 2018-02-19 00:10:01.059 Info: Saved 6 MB in 1 sec at 9 MB/sec to
> /var/opt//Forests/Meters/000059dd 2018-02-19 00:17:01.076 Info: Saving
> /var/opt//Forests/Meters/000059df 2018-02-19 00:17:01.349 Info: Saved
> 6 MB at 22 MB/sec to /var/opt//Forests/Meters/000059df 2018-02-19
> 00:17:01.375 Info: Merging 30 MB from
> /var/opt//Forests/Meters/000059de, /var/opt//Forests/Meters/000059dd,
> and /var/opt//Forests/Meters/000059df to
> /var/opt//Forests/Meters/000059e1, timestamp=15190204210766740
> 2018-02-19 00:17:04.285 Info: Merged 29 MB in 3 sec at 10 MB/sec to
> /var/opt//Forests/Meters/000059e1 2018-02-19 00:17:07.209 Info:
> Deleted 26 MB at 922 MB/sec /var/opt//Forests/Meters/000059de
> 2018-02-19 00:17:07.239 Info: Deleted 6 MB at 198 MB/sec
> /var/opt//Forests/Meters/000059dd 2018-02-19 00:17:07.251 Info:
> Deleted 6 MB at 516 MB/sec /var/opt//Forests/Meters/000059df
> 2018-02-19 00:19:01.558 Info: Merging 1 MB from
> /var/opt//Forests/App-Services/00000a33 to
> /var/opt//Forests/App-Services/00000a35, timestamp=15190205407316140
> 2018-02-19 00:19:01.626 Info: Merged 2 MB at 29 MB/sec to
> /var/opt//Forests/App-Services/00000a35 

这在 grep 命令之前按预期出现,但 grep -V {empty pattern} 反转并且不返回任何内容。我想要像在 grep -V 中传递空模式时那样的东西,它应该不被执行或像 grep 一样行事(因为 grep 在空序列的情况下返回所有内容)。

【问题讨论】:

  • 请提供输入样本、预期输出并解释您如何初始化$dateRange,以便我们重现您的问题。
  • @PierreFrançois 添加了示例
  • @basari66 :澄清一下——您所说的“空模式”是指变量query_valuenot_query_value 包含字符串empty 吗?我问是因为这听起来很奇怪,但在我看来,你真的是这个意思。
  • $query_value 和 $not_query_value 来自属性文件。所以如果 not_query_value= 在属性文件中,那么它什么都没有
  • @basari66,“不想提供任何检查点”是什么意思?请注意,您可以将逻辑 inside 放在管道中; IE。仅当 $query_value 不为空或未设置时,${query_value:+-v} 才会扩展到 -v... 或者您可以将条件放入管道中:... | if [[ $query_value ]]; then grep -v "$query_value"; else cat; fi | ...

标签: bash shell grep


【解决方案1】:

从 grep -v 条件中删除括号以获得所需的结果。 你的代码应该是:

sed -n "$dateRange" "$error_log_file_name"|egrep -i "($query_value)"|grep -E -i -v "$not_query_value"|head -n $first_few_lines_value>>"$extracted_log_path_value"

【讨论】:

  • 整个命令周围的反引号肯定是不希望的。由于输出被重定向到一个文件,命令替换没有什么可捕获的,所以它只是一个昂贵的noop。
  • 编辑了答案以包含建议。谢谢查尔斯!
  • @CharlesDuffy - 哦不..我放括号的原因是我可以在 grep -V 中执行 AND / OR 操作......类似这样的东西 - grep -V "(logic.*start |血)"
  • @basari66 :在这种情况下,使用 egrep -v 。
  • @ManiMaity - grep -E 的意思不是和 egrep 一样吗?
猜你喜欢
  • 2011-08-07
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多