awk または sed は、検索パターンに応じて 1 行に 1 つの出力を表示します。

awk または sed は、検索パターンに応じて 1 行に 1 つの出力を表示します。

次のファイルがあります。 「LC」(2番目の検索パターン)を検索すると、2行以上の出力が得られ、隣接する1番目の検索パターンを1行に1つずつ繰り返すように処理する必要があります。

Schedule Name:       Today

  Schedule Type:       Standard
  Active:              yes
  Effective date:      01/24/2014 11:17:05
  Client Encrypt:      no
  LC/CY/Custmr:  EU         NY  Cindy
                 BU         CA  Victor
                 GU         MI  Bob
  Include:
Schedule Name:       Tomorrow

  Schedule Type:       Standard
  Active:              yes
  Effective date:      01/26/2014 11:17:05
  Client Encrypt:      no
  LC/CY/Custmr:  MU         LA  Martha
                 EU         CA  Sam
  Include:
Schedule Name:       Yesterday

  Schedule Type:       Standard
  Active:              no
  Effective date:      01/21/2014 11:17:05
  Client Encrypt:      no
  LC/CY/Custmr:  NV         IL  Joe

  Include:

希望の出力

Cindy    Today
Victor   Today
Bob      Today
Martha   Tomorrow
Sam      Tomorrow

Schedule Name今私は今日、明日、そしてCustomer name4番目のフィールドであるifActiveを得たいと思いますyes。したがって、出力は次のようになります。

cat billing | 
    awk '/Schedule Name/ || /Active:/ || /Loc/,/^$/' | 
    grep -v '^$'

含める前にはLocの後に空行があり、空行が見つかるまですべてのデータをインポートしようとしたが、空行をgrep -vにして、Schedule nameとActiveをawkingせずに試してみるとうまくいくのにうまくいきません。 together この2つの検索モードで動作します。

以下のコードを使用していますが、非常に遅いです。

for pol in `cat /tmp/Active_Policies`
do
        count=`sudo /usr/openv/netbackup/bin/admincmd/bppllist $pol -U | awk '/HW\/OS\/Client:/,/Include:/' | grep -v "Include:" | wc -l`
        if [ $count -gt 0 ]
        then
                first=`sudo /usr/openv/netbackup/bin/admincmd/bppllist $pol -U | awk '/HW\/OS\/Client:/,/Include:/' | grep -v "Include:" | awk '{print $4}' | head -1`
                echo "$first    $pol" >> /tmp/Clients_Policies_$(date +%m-%d-%Y)
                counter=1
                for client in `sudo /usr/openv/netbackup/bin/admincmd/bppllist $pol -U | awk '/HW\/OS\/Client:/,/Include:/' | grep -v "Include:" | awk '{print $3}' | sed '1d;$d'`
                do
                        ((counter = counter + 1))
                        if [ $counter -le $count ]
                        then
                                echo "$client   $pol" >> /tmp/Clients_Policies_$(date +%m-%d-%Y)
                        fi
                done
        fi
done

答え1

この試み

awk '
    BEGIN{OFS = "\t"}
    /Schedule Name:/{s = $NF}
    /Active:/{a = $2}
    /:|^$/&&!/LC\//{next}
    a == "yes"{print $NF, s}
    ' file

またはsed

sed '
    /Schedule Name:/! d
    s/.*:\s\+//
    :1
    N
    /Active:/! b1
    /yes/! d
    :2
    $! N
    /Include:/d
    /LC\//!{/:\|^$/b2;}
    s/\s*\n.*\s\(\S\+\)\s*/\n\1/
    s/\(.*\)\n\(.*\)/\2\t\1/p
    s/.*\t//
    t2
    ' file

sedバージョン2:

sed -n '
    /Schedule Name:/! d
    s/.*:\s\+//
    h
    :1
    n
    /Active:\s*no/d
    /LC\//!b1
    :2
    s/.*\s\(\S*\)\s*/\1/
    G
    s/\n/\t/p
    n
    /^\s*$\|Include:/! b2
    ' file

答え2

awk '/Schedule/{A="";S=$NF;next}/Active/{A=$NF;next}/Customer/&&A=="yes"{print $NF,S}' billing

関連情報