
문자열이 order[ID].log
어디에 있는지 라는 이름의 여러 파일을 포함하는 폴더가 있습니다 .[ID]
orderID1.log
orderID2.log
orderID3.log
orderID4.log
...
grep
Linux에서 각 파일의 이름에 따라 스크립트를 작성 ID
하고 결과를 파일 이름으로 출력해야 합니다. ID.log
예:
For orderID1.log
, I need to grep 'ID1' orderID1.log > ID1.log
For orderID2.log
, I need to grep 'ID2' orderID2.log > ID2.log
아래 스크립트를 작성하려고 했습니다.
for i in ORDER*.log
do
grep 'i' order$i > $i.log;
done
여기서 문제는 "ID1","ID2"가 아닌 "orderID1","orderID2"로 기록된다는 것입니다. 리눅스에서 이것을 할 수 있는 간단한 방법이 있나요?
답변1
ID
파일 이름에서 하위 문자열을 추출해야 합니다 . 이를 수행하는 한 가지 방법은 매개변수 확장을 통한 것입니다. 예 ${var:offset:length}
를 들어 귀하의 경우 파일 이름 var
은 f
오프셋이고 5
길이 order
는 ${#f}-9
(즉, 전체 길이 ${#f}
에서 의 결합된 길이를 뺀 order
문자 .log
) 9
입니다.
for f in order*.log
do
ID=${f:5:${#f}-9}
grep -- "$ID" "$f" > "$ID".log
done
또는 한 줄짜리를 선호하는 경우:
for f in order*.log; do ID=${f:5:${#f}-9}; grep -- "$ID" "$f" >" $ID".log; done
또는 awk
신청하는 데 사용할 수 있습니다.여러 파일에 동일한 작업:
awk '
FNR==1{
if(fname)close(fname)
id=substr(FILENAME, 6, length(FILENAME)-9)
fname=id".log"
}
$0 ~ id{
print > fname
}
' order*.log
이는 awk
쉘 루프를 피하면서 한 번의 호출로 모든 파일을 수행합니다. 한 줄에:
awk 'FNR==1{if(f)close(f);id=substr(FILENAME, 6, length(FILENAME)-9);f=id".log"} $0~id{print > f}' order*.log