많은 로그 파일에서 일부 ID를 검색하기 위해 쉘(bash)에서 grep을 실행합니다.
grep "100200300" my.log*
결과는 다음과 같습니다.
my.log:Jan 17 15:04:52 100200300 ok
my.log.1:Jan 17 14:35:17 100200300 failed
이제 출력에서 파일 이름을 제거하고 싶습니다. 그러면 ":"이 처음 나타날 때 이 텍스트를 분할하고 두 번째 부분을 출력하려면 어떻게 해야 합니까?
답변1
Steeldriver가 언급했듯이 선호되는 방법은 -h
( --no-filename
) 옵션을 사용하는 것입니다. 구현에 grep
이 옵션이 포함되지 않은 경우 출력을 사용 sed
하거나 cut
변경할 수 있습니다.
grep [OPTIONS] PATTERN [FILE...] | sed 's/[^:]*://'
grep [OPTIONS] PATTERN [FILE...] | cut -d : -f 2-
그러나 이 해결 방법은 콜론( )이 포함된 파일 이름을 손상시키므로 보편적이지 않습니다 :
.
답변2
이렇게 하면 이 질문의 제목에서 요구하는 작업이 수행됩니다. "구분 기호가 처음 나타날 때 문자열 분할"
#!/bin/bash
while read -r line; do
[[ $line =~ :(.*) ]] && echo "${BASH_REMATCH[1]}"
done <<<"$(grep "100200300" my.log*)"
그러나 나는 당신에게 필요한 것이 다음과 같다고 믿습니다:
grep -h "100200300" my.log*
이 -h
옵션을 사용하면 파일 내용이아니요파일 이름:
Jan 17 15:04:52 100200300 ok
Jan 17 14:35:17 100200300 failed
답변3
다음을 수행하여 파일 이름을 제거할 수도 있습니다.
cat my.log* | grep "100200300"