簡體   English   中英

使用Awk和Grep,我需要打印一些行

[英]With Awk and Grep i need to print some lines

我剛寫Perl腳本,所以我想以此作為問題或對此的支持,下面是代碼

start pattern1

line1
Matching pattern can be here
line2
Matching Pattern can be here
line3
line4
...
end pattern1
.
start pattern1
line1
line2
start pattern1

start pattern1
line1
Matching pattern can be here
line2
start pattern1

所以從perl我需要grep開始模式1 ...結束模式1之間的行,為此我正在使用awk命令來grep

 $cmd = q(awk '/start pattern1/,end pattern1 /' x.file );
 $n1 = system($cmd);

為了這個輸出正常,下面是輸出,

start pattern1
line1
**Matching pattern can be here**
line2
**Matching Pattern can be here**
...
end pattern1

但是在文件中,我有1000行這樣的行,因此我需要grep具有匹配模式的行。 即我只需要grep到結束模式行的那些起始模式行具有匹配的模式

為此我嘗試了

 $cmd = q(awk '/start pattern1/,end pattern1 /' x.file | grep  '$n2\|line4');
 $n1 = system($cmd);

但是當我使用上面的命令時,我看不到任何輸出,這里$ n2包含一些從另一個文件中提取的模式。

如果我使用直接匹配的模式代替$ n2可以正常工作,為什么我不能在這里使用$ n2?

注意:我在perl腳本中使用它

從Awk命令中,我獲得了起始pattern1 ... end pattern1之間的所有行,但是我有1000個這樣的打印件,所以我需要一束從start pattern1到thos的結束pattern1的行,這些行與匹配的模式匹配

我做的時候預期的輸出是

start pattern1
line1
Matching pattern can be here
line2
Matching Pattern can be here
line3
line4
...
end pattern1 

 start pattern1
    line1
    Matching pattern can be here
    line2
    start pattern1

無需從perl內部召喚awk,因為perl比awk強大得多。

我不清楚是否要在start pattern1end pattern1之間的每一行,如果內部至少有一個匹配項,或者只是匹配的行。

如果開始和結束之間的每一行都匹配:

my @blocks = join("",<>)=~/start pattern1\s*(.*?)end pattern1/gsi;
print grep /matching pattern/i, @blocks;

如果每一行包括開始|結束模式1:

my @blocks = join("",<>)=~/(start pattern1.*?end pattern1\s*)/gsi;

如果僅在開始和結束之間用/ matching pattern /匹配:

print grep { /start pattern1/i../end pattern1/i and /matching pattern/i } <>;

將其放入文件program.pl並運行:

perl program.pl inputfile > outputfile

可能需要一些解釋: join("",<>)將整個輸入文件作為一個多行字符串返回。 /gsi修飾符表示: g全局匹配,因此@block數組將包含括號中所匹配的內容,每個匹配項包含一個數組元素(沒有g@block數組將僅獲得第一@block ), s表示. 也匹配換行符,否則它將不匹配, i通過忽略大小寫進行匹配(看不到AZ和AZ字母之間的區別)。 .*?問號.*? 表示每個字符都沒有貪婪匹配,也就是說,匹配到下一個 end pattern1而不是最后一個。 <>返回的線inputfile (后ARGS perl program.pl )作為字符串的數組。 ..是觸發器運算符,在左側變為true之后為true,在右側變為true之后為false,並保持為false,直到左側再次變為true,依此類推。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM