
다음 파일이 있습니다. "LC"(두 번째 검색 패턴)를 검색하면 두 줄 이상의 출력이 제공되며, 인접한 첫 번째 검색 패턴을 한 줄에 하나씩 반복하도록 처리해야 합니다.
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
네 번째 필드인 if Active
를 얻고 싶습니다 yes
. 따라서 출력은 다음과 같아야 합니다.
cat billing |
awk '/Schedule Name/ || /Active:/ || /Loc/,/^$/' |
grep -v '^$'
포함하기 전에는 Loc 뒤에 빈 줄이 있어서 빈 줄을 찾을 때까지 모든 데이터를 가져오려고 하다가, 빈 줄을 grep -v로 하고, Schedule name과 Active를 awking하지 않고 시도하면 잘 되는데 잘 안 되네요. together 이 두 가지 검색 모드를 통해 작동합니다.
아래 코드를 사용하고 있는데 속도가 매우 느립니다.
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