【发布时间】:2018-02-22 01:25:47
【问题描述】:
我有一段代码可以正常工作,但我想要一个不同的结果。假设$query_value 和$not_query_value 是empty。
`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_value和not_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 | ...