파일 이름의 일부를 패턴으로 사용하여 여러 파일을 grep하는 방법은 무엇입니까?

파일 이름의 일부를 패턴으로 사용하여 여러 파일을 grep하는 방법은 무엇입니까?

예를 들어 문자열이 order[ID].log어디에 있는지 라는 이름의 여러 파일이 포함된 폴더가 있습니다.[ID]

orderID1.log
orderID2.log
orderID3.log
orderID4.log
...

Linux에서 grep파일 이름별로 각 파일에 스크립트를 작성 ID하고 그 결과를 ID.log 파일 이름으로 출력해야 합니다. 예:
For orderID1.log, I need grep 'ID1' orderID1.log > ID1.log
For orderID2.log, I need 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}귀하의 경우 ilename) 를 통해 확장하는 것입니다. 오프셋은 var( ) 이고 길이는 다음과 같습니다 (즉, 총 길이에서 합계의 결합 길이를 뺀 값 , 여기서 문자는 다음과 같습니다).f5order${#f}-9${#f}order.log9

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

관련 정보