我想从以下类型的输入中提取一个数字(在本例中为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*$/'