从通过管道传输到 Perl 的多行文本中提取字段



我想从以下类型的输入中提取一个数字(在本例中为7):

received_tli 
--------------
7
(1 row)

我已经看到了多行字符串作为Perl变量存在的情况的配方。但是,我更喜欢像这样调用表达式:

psql -c "SELECT received_tli FROM pg_stat_wal_receiver" | 
perl -e 'print $1 if /<expression>/'

我已经尝试过例如s^received_tlis*n-+ns*([0-9])+s*n(1 row)作为表达,但这似乎不起作用。如何解析使用(多行)正则表达式通过管道传输到 Perl 的多行输入?

你在perl -e上遇到的问题是,你从来没有阅读过STDIN,因此perl没有"看到"你的数据。

你可以使用-ne告诉 perl 将你的代码片段包装在一个while ( <> ) { }循环中。不过,这可能用途有限,因为它是逐行工作的。

因此,您需要设置"行尾分隔符"(-0标志),然后应用正则表达式:

perl -0777 -ne 'print $1 if m/received_tliD*(d+)/' 

或者用更长的perl脚本编写(但希望更具可读性):

#!/usr/bin/perl
use strict;
use warnings;
local $/;
while (<>) {
print $1,"n" if m/received_tliD*(d+)/;
}

完全没有必要涉及 Perl。只需使用psql中的-t--tuples-only选项:

psql -t -c "SELECT received_tli FROM pg_stat_wal_receiver"

从示例数据来看,您似乎希望在仅包含该整数和一些空格的行上使用整数。所以这样的事情会起作用:

#!/usr/bin/perl
use strict;
use warnings;
while (<>) {
/^s*(d+)s*$/ and print $1;
}

您可以将其放入文件中,使其可执行,然后使用以下方法运行它:

$ psql ... | your_extract_program

但是如果你真的想每次都重新输入Perl代码,你可以使用:

$ psql ... | perl -n -e 'print $1 if /^s*(d+)s*$/'

最新更新