나는 큰 텍스트 파일 세트에서 모든 개별 Unix 명령을 추출하려고 합니다.
이것이 내가 지금까지 가지고 있는 것입니다:
tx
이 예에서는 명령의 모든 인스턴스를 추출합니다 . 그 안에는 텍스트 문서가 잔뜩 들어 있고 /PROJECT/DOCS
이름은 모두 입니다 whatever.EXT
.
#!/bin/bash
rm -f ~/Documents/proc-search.txt
cd /PROJECT/DOCS
for file in *
do
echo "PROC Name: "$file >> ~/Documents/proc-search.txt
echo "Description:" >> ~/Documents/proc-search.txt
awk 'NR==1' $file >> ~/Documents/proc-search.txt
echo "UNIX Commands:" >> ~/Documents/proc-search.txt
awk '/tx/{print}' $file >> ~/Documents/proc-search.txt
echo "########################################" >> ~/Documents/proc-search.txt
done
tx
나는 proc-search.txt를 열었고 실제로 이 명령의 모든 인스턴스를 캡처했기 때문에 매우 기뻤습니다 . 그러나 명령이 포함되어 있지 않기 때문에 원하지 않는 파일에 대한 정보도 출력합니다 tx
. ACPFM.EXT
아래 예와 같습니다 . 제외할 수 있는 방법이 있나요?필드파일이 없나요 tx
?
이것이 제가 얻은 출력입니다. proc-search.txt입니다. 에 대한 보고서나 .EXT 명령을 ACPFM.EXT
사용하지 않는 다른 항목을 보고 싶지 않다는 점을 제외하면 괜찮아 보입니다.tx
PROC Name: 17.EXT
Description:
* NORMPARD (EDIT CONTRL FILE)
UNIX Commands:
# tx @CONTRL <- YAY! This is a result that I want.
########################################
PROC Name: ACPFM.EXT <- I don't want this stanza.
Description:
* ACPFM (Account PARameter File Maintenance)
UNIX Commands:
########################################
PROC Name: ACTDARA.EXT
Description:
*
UNIX Commands:
#tx @SEQFILE <- YAY! This is a result that I want.
########################################
PROC Name: ACTEDIT.EXT
Description:
*
UNIX Commands:
#tx @SEQFILE <- YAY! This is a result that I want.
########################################
답변1
당신의 (요약된) 루프
for file in *
do
echo "PROC Name: "$file >> ~/Documents/proc-search.txt
awk '/tx/{print}' $file >> ~/Documents/proc-search.txt
done
"PROC Name: foo"
모든 파일과 일치하는 awk
줄만 인쇄합니다 tx
.
어쩌면 당신이 원할 수도 있습니다 (디렉토리와 일치하는 것이 없다고 가정 *)
for file in $(grep -l tx *)
이렇게 하면 루프의 모든 파일에 tx
문자열이 포함됩니다.
답변2
필요한 것은 다음과 같습니다.
#!/usr/bin/env bash
cd /PROJECT/DOCS &&
awk '
FNR==1 {
desc = $0
doneHdr = 0
}
/tx/ {
if ( !doneHdr++ ) {
printf "%s", sep
sep = "########################################" ORS
print "PROC Name:", FILENAME
print "Description:" ORS desc
print "UNIX Commands:"
}
print
}
END {
printf "%s", sep
}
' * > ~/Documents/proc-search.txt
그러나 샘플 입력과 예상 출력이 없으면 이는 테스트되지 않은 추측일 뿐입니다.
답변3
Archemar는 올바른 생각을 가지고 있지만 (내 생각에는) 잘못된 접근 방식을 가지고 있습니다. 나는 간단히 말하고 싶습니다 :
#!/bin/bash
command_name=tx # or use "$1" if you want to be able to pass this as an arg
cd /PROJECT/DOCS &&
for file in *
do
if grep -q "$command_name" "$file"
then
echo "PROC Name: $file"
echo "Description:"
head -n1 "$file"
echo "UNIX Commands:"
grep "$command_name" "$file"
echo "########################################"
fi
done > ~/Documents/proc-search.txt