로그를 읽을 때 단어를 제외하기 위해 다른 파일을 읽는 현명한 방법

로그를 읽을 때 단어를 제외하기 위해 다른 파일을 읽는 현명한 방법

로그 파일을 검색할 때 제외하려는 단어를 제외하기 위해 언제든지 수정할 수 있는 별도의 텍스트 파일을 원합니다. 지금까지 나는 내 목적에 맞게 아래의 기본 스크립트를 작성했습니다. Sun 운영 체제에서. 도와주세요.

find /export/home/testing/ -type f -name "apache_logs.txt" |while read file
  do  
    result=$(tail -50 $file |grep -v 'HTTP/1.1" 200'  $file)
    echo "$result" > result1.txt
    grep -v 'akamai/sureroute' | grep -v '/wp7/wp-login.php' | grep -v  'HTTP/1.0" 200' result1.txt  > result.txt; 
  done

답변1

Solaris에서는 /usr/xpg4/bin/grep파일에서 패턴을 읽고 then을 -f사용하여 문자열 비교를 수행하는 데 사용할 수 있습니다 -F.

find /export/home/testing -type f -name apache_logs.txt -exec tail -n 50 {} \; |
/usr/xpg4/bin/grep -vF -f avoid.txt >result.txt

... avoid.txt한 줄에 하나의 문자열이 포함된 텍스트 파일:

akamai/sureroute
/wp7/wp-login.php
HTTP/1.0" 200
HTTP/1.1" 200

apache_logs.txt이것은 디렉토리 안이나 아래에서 호출되는 일반 파일을 찾습니다 /export/home/testing. 이러한 각 파일에 대해 tail -n 50호출하여 마지막 50줄을 가져옵니다(코드에 따라, 각 파일의 전체 내용을 가져오려면 cat대신 사용하세요).tail -n 50

결과 텍스트 줄은 파이프로 연결되고 파일에 나열된 하위 문자열을 포함하는 각 줄은 /usr/xpg4/bin/grep필터링(제거)됩니다 .avoid.txt

사용된 옵션 grep

  • -v일치의 의미를 뒤집습니다(행 반환아니요일치하는 패턴).
  • -F각 패턴을 다음과 같이 처리합니다.정규식 일치 대신 문자열 비교를 수행합니다. 이를 통해 파일의 패턴에 특수 문자를 이스케이프하지 않고 정규 표현식에 포함할 수 있습니다.
  • -f avoid.txt파일에서 패턴을 읽습니다 avoid.txt.

텍스트의 나머지 줄이 기록됩니다 result.txt.

-F옵션이 없으면 패턴에 주의하여 avoid.txt올바른 정규식으로 만들어야 합니다. 어쩌면 좋아

akamai/sureroute
/wp7/wp-login\.php
HTTP/1\.[01]" 200

find딱 하나만 찾고 싶다면단일 파일, 코드는 다음과 같이 단순화될 수 있습니다.

tail -n 50 /path/to/apache_logs.txt |
/usr/xpg4/bin/grep -vF -f avoid.txt >result.txt

코드에 몇 가지 문제가 있습니다.

  • 변수 확장을 인용하지 않습니다. 바라보다언제 큰따옴표가 필요합니까?
  • 불필요하게 파이프 결과를 변수에 저장한 다음 이를 사용하여 echo결과를 파일로 출력하고 있습니다.
  • 첫 번째 tail+ 파이프는 파이프의 양쪽에 사용됩니다 grep. 이로 인해 의 입력이 무시 $file됩니다 .greptail
  • 두 번째(더 긴) 파이프는 result1.txt마지막 파이프에만 사용되며 grep이전 grep명령은 stdin에서 데이터를 읽기 위해 대기하며(이는 존재하지 않음) grep마지막 명령이 완료된 후 결국 종료됩니다.

    이 유형의 파이프는 일반적으로 다음과 같습니다.

    command inputfile | command | command | command
    

    즉, 일부 입력 파일에서 데이터를 읽고 이를 표준 출력에 쓰는 명령으로 시작합니다. 출력은 다음 명령으로 읽혀지며,그것은출력은 다음 출력에서 ​​읽혀집니다.

  • 출력 파일 result.txt고쳐 쓰기apache_logs.txt발견된 각 파일 에 대해 쓰기 위해 루프에서 사용한 것처럼 처음부터 시작합니다 . 단일 파일 >만 찾으려는 경우에는 괜찮을 수 있습니다 find(이 경우 find파일이 파일 시스템에서 이동하지 않을 수 있으므로 사용하지 않는 것이 가장 좋습니다).

  • find구문 분석의 출력(발견된 파일의 경로 이름)을 사용합니다 read. 일반적으로 Unix의 경로 이름에는 \0C 프로그래밍 언어의 문자열 종결자인 널 문자( )를 제외하고 줄 바꿈 및 백슬래시를 포함한 모든 문자가 포함될 수 있기 때문에 이는 일반적으로 좋지 않은 생각입니다. 바라보다찾기 결과를 반복하는 것이 왜 나쁜 습관입니까?

또한 관련:

관련 정보