[英]Output from bash command not storing in array
我下面的代碼非常簡單...我所要做的就是使用IP地址REGEX來查找文件,找到的任何與我的REGEX匹配的IP地址都想存儲在@ array2中。
我知道我的REGEX可以工作,因為ive在linux命令行上對其進行了測試,並且它的工作方式完全符合我的要求,但是當它集成到腳本中時,它只會返回空白。 陣列中應存儲700個IP。
#!/usr/bin/perl
use warnings;
use strict;
my @array2 = `grep -Eo "\"\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\"" test1.txt`;
print @array2;
反引號``
默認情況下就像雙引號字符串一樣。
因此,您需要轉義反斜杠:
my @array2 = `grep -Eo "\\"\\b[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\"" test1.txt`;
另外,您可以使用單引號的qx
以避免任何插值:
my @array2 = qx'grep -Eo "\"\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\"" test1.txt';
但是,我建議的方法是完全不使用Shell,而是在perl中執行以下邏輯:
my @array2 = do {
open my $fh, '<', 'test1.txt' or die "Can't open file: $!";
grep /\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\b/, <$fh>;
};
我真的不會混合bash和perl。 它只是在尋求痛苦。 Perl可以原生完成所有操作。
就像是:
open (my $input_fh, "<", "test.txt" ) or die $!;
my @results = grep ( /\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/, <$input_fh> );
但是,這確實需要將文件拖到內存中,這不是最佳選擇-我通常會使用while
循環。
反引號內的文本經過雙引號替換。 您需要將反斜杠加倍。
無論如何,從Perl內部運行grep
是可疑的。 只需將其插入文本文件並使用Perl查找匹配項即可。
從外部命令檢索輸出的最簡單方法是使用open():
open(FH, 'grep -Eo \"\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\" test1.txt'."|")
my @array2=<FH>;
close (FH);
..盡管我認為Sobrique的想法是這里的最佳答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.