次のファイルがあります。 「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 name
4番目のフィールドである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