로그 파일을 검색할 때 제외하려는 단어를 제외하기 위해 언제든지 수정할 수 있는 별도의 텍스트 파일을 원합니다. 지금까지 나는 내 목적에 맞게 아래의 기본 스크립트를 작성했습니다. 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
됩니다 .grep
tail
두 번째(더 긴) 파이프는
result1.txt
마지막 파이프에만 사용되며grep
이전grep
명령은 stdin에서 데이터를 읽기 위해 대기하며(이는 존재하지 않음)grep
마지막 명령이 완료된 후 결국 종료됩니다.이 유형의 파이프는 일반적으로 다음과 같습니다.
command inputfile | command | command | command
즉, 일부 입력 파일에서 데이터를 읽고 이를 표준 출력에 쓰는 명령으로 시작합니다. 출력은 다음 명령으로 읽혀지며,그것은출력은 다음 출력에서 읽혀집니다.
출력 파일
result.txt
은고쳐 쓰기apache_logs.txt
발견된 각 파일 에 대해 쓰기 위해 루프에서 사용한 것처럼 처음부터 시작합니다 . 단일 파일>
만 찾으려는 경우에는 괜찮을 수 있습니다find
(이 경우find
파일이 파일 시스템에서 이동하지 않을 수 있으므로 사용하지 않는 것이 가장 좋습니다).find
구문 분석의 출력(발견된 파일의 경로 이름)을 사용합니다read
. 일반적으로 Unix의 경로 이름에는\0
C 프로그래밍 언어의 문자열 종결자인 널 문자( )를 제외하고 줄 바꿈 및 백슬래시를 포함한 모든 문자가 포함될 수 있기 때문에 이는 일반적으로 좋지 않은 생각입니다. 바라보다찾기 결과를 반복하는 것이 왜 나쁜 습관입니까?
또한 관련: