셸 스 크 립 트 학습: 세심 한 sed 와 grep, sort 와 유 니 크, 디 테 일 한 부분 에서 '진지' 를 볼 수 밖 에 없습니다.
오늘 오후의 대본:
스 크 립 트 작성: 1. 파일 다운로드ftp://192.168.0.254/pub/Files/access_로그 ~/tmp 디 렉 터 리;2, 분석 및 표시/tmp/accesslog 파일 에서 줄 의 맨 위 에 있 는 IP 중 가장 많은 횟수 가 있 는 5 개 는 각각 몇 번 나 타 났 는 지 설명 합 니 다.3, 추출/tmp/accesslog 파일 은 http://로 시작 하고 도 메 인 이름 이나 IP 주소 의 문자열 을 따라 갑 니 다. 예 를 들 어:http://www.linux.com/install/images/style.css 이 꼬치 의http://www.linux.com의 부분이후 에 출현 횟수 가 가장 많은 5 개 를 표시 합 니 다.요구: 제2, 3 기능 은 각각 함수 의 방식 으로 이 루어 집 니 다.
#aceess_로그 의 파일 정보 부분 은 다음 과 같 습 니 다.
pleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13"192.168.0.191 - - [24/Jul/2011:17:43:17 +0800] "GET/static/image/cr180_dzx//scrolltop.gif HTTP/1.1"304 - "http://www.linux.com/forum.php""Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13"192.168.0.191 - - [24/Jul/2011:17:43:17 +0800] "GET/uc_server/images/noavatar_small.gif HTTP/1.1"304 - "http://www.linux.com/forum.php""Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13"192.168.0.191 - - [24/Jul/2011:17:43:17 +0800] "GET/favicon.ico HTTP/1.1"304 - "-""Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13"192.168.0.191 - - [24/Jul/2011:17:43:17 +0800] "GET/forum.php HTTP/1.1"200 17354 "http://www.linux.com/group.php""Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13"192.168.0.191 - - [24/Jul/2011:17:43:17 +0800] "GET/data/cache/style_2_common.css?o4R HTTP/1.1"304 - "http://www.linux.com/forum.php""Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13"192.168.0.191 - - [24/Jul/2011:17:43:17 +0800] "GET/data/cache/style_2_forum_index.css?o4R HTTP/1.1"304 - "http://www.linux.com/forum.php""Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13"192.168.0.191 - - [24/Jul/2011:17:43:17 +0800] "GET/static/js/common.js?o4R HTTP/1.1"304 - "http://www.linux.com/forum.php""Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13"192.168.0.191 - - [24/Jul/2011:17:43:17 +0800] "GET/static/image/cr180_dzx//bg.jpg HTTP/1.1"304 - "http://www.linux.com/forum.php""Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13"192.168.0.191 - - [24/Jul/2011:17:43:17 +0800] "GET/static/image/diy/panel-toggle.png HTTP/1.1"304 - "http://www.linux.com/forum.php""Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13"
우리 의 목적 은 지정 한 정 보 를 캡 처 하고 순 위 를 매 기 는 것 입 니 다. 그러면 반드시 정규 표현 식 을 사용 해 야 합 니 다. 그리고 세 개의 긴 정규 표현 식 입 니 다. 정규 표현 식 의 작성 에 대해 어느 정도 요구 가 있 습 니 다. 저 는 이 세 개의 정규 표현 식 을 쓸 때 많은 문제 가 발생 했 습 니 다. 제목 의 요구 에 따라 sed 명령 으로 지정 한 내용 을 잡 고 교체 해 야 합 니 다. 그리고 저 는 나타 납 니 다.아래 와 같은 잘못 을 저 질 렀 다
1 정규 표현 식 마지막 에 추가 하 는 것 을 잊 었 습 니 다. * 이렇게 하면 이렇게 긴 줄 을 교체 하 는 작용 을 하지 못 한다
2 sed 명령 캡 처 후 요구 에 부합 되 지 않 는 항목 도 표 시 됩 니 다. grep "http://"를 사용 할 수 있 습 니 다. 이런 쓸모없는 줄 을 없 애 라.
3\{ \} { }\ 오류 에 속 하지만, 비교적 긴 정규 표현 식 은 이러한 오 류 는 용서 할 수 없 기 때문에 반드시 옮 겨 야 할 괄호 를 완성 한 다음 에 일치 하 는 내용 을 써 서 오류 가 발생 하지 않도록 해 야 한다.
4 sed 명령 은 '중 하 나 를 쓰 는 것 을 잊 어 버 리 고 실현 해 야 한다 면' 잊 어 버 리 지 않도록 '를 써 야 한다.
나의 두 번 째 함 수 는 다음 과 같다.
function URL {
sed '1,$s@.*\(http://[a-zA-Z]\{1,\}\.[a-zA-Z]\{1,\}\.[a-zA-Z]\{1,\}\).*@\1@g' /tmp/access_log | grep "^http://" > /tmp/tt.1
sed '1,$s@.*\(http://[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\).*@\1@g' /tmp/access_log | grep "^http://" >> /tmp/tt.1
echo -e " \033[33mTIMES Doman\033[0m \033[5;32m<---------Here is the doman rank\033[0m"
sort /tmp/tt.1 | uniq -c | sort -rn | head -5
}
이렇게 긴 정규 표현 식 은 오류 가 발생 하기 쉬 우 므 로 나중에 sed 명령 과 정규 표현 식, 그리고 다른 명령 을 쓸 때 교훈 을 얻 기 를 바 랍 니 다.
sort 와 uniq
이 두 명령 은 특히 무시 하기 쉬 운 문제 가 있 습 니 다. 예 를 들 어 유 니 크 명령 이 sourt - n 을 사용 할 때 숫자 크기 로 비교 하 는 것 이 아니 라 첫 글자 크기 로 비교 하 는 것 입 니 다! (제발 주의)따라서 sort - rn 을 사용 하여 숫자 로 정렬 해 야 합 니 다. 유 니 크 는 특별한 데 이 터 를 처리 할 때 sort 를 사용 하지 않 으 면 원 하 는 결과 가 아 닙 니 다. 다음 과 같 습 니 다.
[root@dean 725-27]# sed '1,$s@.*\(http://[a-zA-Z]\{1,\}\.[a-zA-Z]\{1,\}\.[a-zA-Z]\{1,\}\).*@\1@g' /tmp/access_log | grep "^http://" | uniq -c
2 http://www.baidu.com //baidu !
11983 http://www.linux.com
1 http://i.ifeng.com
3761 http://www.linux.com
4 http://www.baidu.com // !
이것 은 유 니 크 의 처리 체제 가 모두 중복 되 는 것 이 아니 라 연속 으로 반복 되 기 때 문 입 니 다. 따라서 정확 한 사용 방법 은 먼저 처리 할 파일 을 sort 로 정렬 하고 중복 되 는 정렬 을 함께 한 다음 유 니 크 로 처리 하 는 것 입 니 다.
sort file | uniq -c | sort -rn
정렬 실현
전체 스 크 립 트 의 코드 는 다음 과 같 습 니 다.
#!/bin/bash
cd /tmp
wget ftp://192.168.0.254/pub/Files/access_log
echo -e "\033[32mdownload secessfull!\033[0m "
echo "---------------------------------------"
FILE=/tmp/access_log
function IP {
echo -e " \033[33mTIMES IP\033[0m \033[5;32m<------------ Here is the ip rank\033[0m"
awk '{print $1}' $FILE | sort | uniq -c | sort -rn | head -5
}
function URL {
sed '1,$s@.*\(http://[a-zA-Z]\{1,\}\.[a-zA-Z]\{1,\}\.[a-zA-Z]\{1,\}\).*@\1@g' /tmp/access_log | grep "^http://" > /tmp/tt.1
sed '1,$s@.*\(http://[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\).*@\1@g' /tmp/access_log | grep "^http://" >> /tmp/tt.1
echo -e " \033[33mTIMES Doman\033[0m \033[5;32m<---------Here is the doman rank\033[0m"
sort /tmp/tt.1 | uniq -c | sort -rn | head -5
}
IP
URL
rm -f /tmp/tt.1
\#\# 요약: 셸 스 크 립 트 를 쓸 때 는 명령 의 용법 을 먼저 생각 하고 명령 의 쓰기 형식 과 용법 을 명 확 히 할 때 오류 가 발생 하기 쉬 운 부분 을 먼저 써 서 오 류 를 피해 야 합 니 다. 다른 주의 할 점 은 if 문장의 마지막 fi 와 같 습 니 다. if 오른쪽 에 바짝 붙 어 있 는 then. 순환 체 후의 done ,마지막 으로 캐 시 파일 을 삭제 합 니 다. case 문 구 는 끝 이 없 을 때; 마지막 *) 은 '*' 가 아니 라 마지막 esac 등 이 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
제한된 크기의 디렉토리를 만드는 방법오늘 저는 장치에 공간이 없을 때 백업 중에 응용 프로그램이 어떻게 작동하는지 테스트(및 수정)하는 작업이 있습니다. 결과적으로 "남은 공간 없음"오류로 백업이 실패하면 새 파일이 없어야 합니다. 지금까지 문제를 재...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.