如何 grep 下面的匹配条件

如何 grep 下面的匹配条件

我有一个任务需要一些逻辑才能 grep 查找部分之间的行:

我的文件中有以下内容:

1856 /dev/informix/chunkbig10_1039

eppix:'informix'.lsc_ix1 212995
eppix:'informix'.api_valid_token 213201
eppix:'informix'.leads_reasons 213841
eppix:'informix'.epx_vas_sms 214481
eppix:'informix'.lsc_ix1 215121
eppix:'informix'.lsc_ix1 287926
eppix:'informix'.cn_clawback_idx 288750
eppix:'informix'.consent_types_idx 288782
eppix:'informix'.lsc_ix1 288850



1936 /dev/informix/chunkbig10_1119




1937 /dev/informix/chunkbig10_1120




1981 /dev/informix/chunkbig10_1164




1982 /dev/informix/chunkbig10_1165

我需要从文件中提取的是,如果我 grep for chunkbig10_1039,我想打印所有行 eppix* 并且我什至不知道从哪里开始如何实现这一点。问题是我无法 grep 查找 eppix,因为如果它很简单,那么它可以是任何东西,但不是一个示例。

答案1

$ awk '$1~/^[0-9]+$/{ f=/chunkbig10_1039/; next } f && NF' file
eppix:'informix'.lsc_ix1 212995
eppix:'informix'.api_valid_token 213201
eppix:'informix'.leads_reasons 213841
eppix:'informix'.epx_vas_sms 214481
eppix:'informix'.lsc_ix1 215121
eppix:'informix'.lsc_ix1 287926
eppix:'informix'.cn_clawback_idx 288750
eppix:'informix'.consent_types_idx 288782
eppix:'informix'.lsc_ix1 288850

答案2

你说

...我想打印所有行 eppix* ...

好吧,正如 αГsнιη 指出的那样,你可以(对于给定的输入)使用

grep 'eppix' infile

实际上,对于给定的输入,你可以得到想要的结果

printf "eppix:'informix'.%s\n" 'lsc_ix1 212995' 'api_valid_token 213201' 'leads_reasons 213841' \
                        'epx_vas_sms 214481' 'lsc_ix1 215121' 'lsc_ix1 287926' \
                        'cn_clawback_idx 288750' 'consent_types_idx 288782' 'lsc_ix1 288850'

但你也说

... grep 查找节之间的行

所以我猜测您的意思是您希望将搜索限制在chunkbig10_1039和 next之间的行chunkbig10_。而且,既然你说

...我想打印所有行 eppix* ...

我将做出一个激进的假设,即您想要打印包含eppixchunkbig10_1039和 next之间的所有行chunkbig10_,并且那里可能还有其他非空行。

如果这不是您想要的,请编辑你的问题可以更清楚地解释你想要什么。

我们可以通过一次调用来做到这一点sed

sed -n '/chunkbig10_1039/,/chunkbig10_/ { /eppix/p }' infile
  • sed n意思是“不要打印所有内容;只需打印我们所说的打印内容即可。”
  • /eppix/p意思是“打印包含eppix”的每一行,并且
  • /chunkbig10_1039/,/chunkbig10_/ { … }意思是“只对第一个匹配项 和下一个匹配项之间的行执行{命令。”}chunkbig10_1039chunkbig10_

我制作了一个更简单(更易于阅读)的输入文件,它展示了我的假设(以及缺乏的假设):

$ cat infile
eppix ant
chunkbig10_1
bat
eppix cat
dog
eppix elk

chunkbig10_2
eppix fox
gopher
horse
chunkbig10_3
impala
eppix jaguar
kangaroo
eppix llama

$ sed -n '/chunkbig10_1/,/chunkbig10_/ { /eppix/p }' infile
eppix cat
eppix elk

$ sed -n '/chunkbig10_2/,/chunkbig10_/ { /eppix/p }' infile
eppix fox

$ sed -n '/chunkbig10_3/,/chunkbig10_/ { /eppix/p }' infile
eppix jaguar
eppix llama
  • 如果您只想查找符合以下条件的行开始eppix, 如此说。
  • 如果您想查找“部分”中的所有非空行,请这么说。
  • 如果您可能有包含 的行chunkbig10_1039 foo,请这么说。
  • 如果您可能有包含chunkbig10_1039bar (或chunkbig10_103942) 的行,请说明。
  • 如果
    chunkbig10_2
    
    不会结束一个部分,但它必须是
    1983 /dev/informix/chunkbig10_2
    
    这样说的。
  • 如果您的行可能包含chunkbig10_ 并且 eppix,说出您想对它们做什么。

答案3

sed -n -e '/chunkbig10_1039/,/chunkbig10_*/ p' test|grep -v 'chunkbig'

相关内容