簡體   English   中英

Perl 腳本處理輸入文件並實現願望 output

[英]Perl script process input file and achieve desire output

這是 Perl 腳本,讀取包含 IP 和 stsco 名稱的文件。 我將項目溢出到兩列並使用第二個 c2 進行處理。 並調用另一個 Perl 腳本來返回我需要的值並將其打印到文件中。 如果您看到我的輸入文件第 8 行( 10.22.1.50 stsco25527020 )不采用此值,不知道為什么,可能是因為 IP 和 stsco 之間有空格。 您能否幫助我了解如何實現 output 的願望? 如果您知道為什么我的腳本在第 8 行沒有發揮價值,也將不勝感激

use strict;
use warnings;
use Data::Dumper;

my $input_file = 'status.txt';
my $output_file = 'status_results.txt';
open my $fh, '<', $input_file or die $!;
open my $wfh, '>', $output_file or die $!;

while (<$fh>){
    chomp;
    next if /^\</;
    next if /^\s*$/;

    my ($c1, $c2) = split /\s/, $_;
    my $stssysId = "$c2";
    $stssysId = `/bin/call_api.pl --op=stssys_id --kv stssys_id=$stssysId | grep Status`;
    print $wfh "$c2\t$stssysId\n";
}

status.txt(這是輸入文件)

10.22.10.12   stsco28698039
10.22.13.38   stsco28016005
10.22.11.23   stsco28497006
10.22.10.15   stsco28598003
10.22.18.12   stsco28534122
10.22.10.15   stsco28598002
10.22.12.10   stsco26944008
10.22.1.50            stsco25527020
10.22.70.21   stsco28698022
10.22.15.22   stsco28698024
10.24.70.74   stsco9372006
10.24.54.16   stsco28698020

status_results(output 文件)

stsco28698039         "Status" : "Active",

stsco28016005         "Status" : "Active",

stsco28497006         "Status" : "Active",

stsco28598003         "Status" : "Active",

stsco28534122         "Status" : "Active",

stsco28598002         "Status" : "Active",

stsco26944008         "Status" : "Active",


stsco28698022
stsco28698024
stsco9372006
stsco28698020
stsco28598004         "Status" : "Active",

渴望 output - 或結果 - (我想刪除“狀態”:“和')

stsco28698039         Active

stsco28016005         Active

stsco28497006         Active

stsco28598003         Active

stsco28534122         Active

stsco28598002         Active

stsco26944008         Active


stsco28698022
stsco28698024
stsco9372006
stsco28698020
stsco28598004         Active

嘗試拆分一個或多個空白字符而不是單個空白字符:

my ($c1, $c2) = split /\s+/, $_;

要使$stsysId只有活動部分:

#Matches any of the characters '"', ",", ":", space, or the word Status
$stsysId =~ s/[",: ]|Status//g;

或者

#[0] is "" (the empty string), [1] is Status, [2] is " : ", [3] is "Active"
$stsysId = (split '"', $stsysId)[3];
$stsysId //= ""; #Perl 5.10.0+
$stsysId = "" unless defined $stsysId; #older perls

或者

#Match two double quote delimited strings, possibly with characters in between.
$stsysId =~ m/"([^"]+)".*?"([^"]+)"/;
$stsysId = $2 if defined $2;

請調查以下代碼片段是否符合您的任務。

可以使用更精確的正則表達式來處理輸入數據以過濾掉所需的輸入數據。 通過這樣做,代碼變得更短且更抗錯誤 隨意嘗試使用正則表達式來匹配輸入文件的內容。

在這種特殊情況下,沒有arguments (特殊情況等價於/\s+/ )的拆分將滿足您的要求 - 將字符串拆分為兩個值。 最好為ipnode等值分配更合適的名稱。

使用反引號來獲取狀態可能不是最佳選擇(盡管它可以滿足您的需求)。 您可以使用 pipe 中的外部程序過濾掉不需要的參數,或者在列表上下文中使用反引號。

Perl 提供qx(command argument.. argument)作為反引號的替代,這使代碼更易於閱讀。 不要害羞嘗試使用此選項。 perl qx

相反,您可以在 pipe 上使用 open來提供節點狀態的命令。 這將允許您將命令的 output 作為文件讀取,並使用 perl 的指令過濾/捕獲感興趣的信息。

或者作為替代選項,您可以使用帶有 arguments 數組的命令system調用(更安全的調用形式)。

在提供的代碼示例中,為簡單起見,節點的$state是通過正則表達式捕獲的。 按照設計,它應該捕獲節點的 state - 由於沒有call_api.pl實用程序,這部分沒有經過測試。

use strict;
use warnings;
use feature 'say';

my $re = /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s+stsco\d+/;

while( <> ) {
    next unless /$re/;
    my($ip,$node) = split;
    my $status = `/bin/call_api.pl .....`;
    my($state) = $status =~ /^$node\s+"Status" : "(\w+)"/;
    say  join("\t",$node,$state);
}

運行為script.pl nodes.txt > status.txt

參考: split , regex , system , qx , open null filehandle <>

調用腳本后,第二個腳本修改字符串以刪除不需要的部分:

  $stssysId =~ s/Status : //;
  $stssysId =~ s/\"//g;

暫無
暫無

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

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