셸 스 크 립 트 학습: 세심 한 sed 와 grep, sort 와 유 니 크, 디 테 일 한 부분 에서 '진지' 를 볼 수 밖 에 없습니다.

오늘 오후 에 바 빠 서 오후 내 내 작은 스 크 립 트 를 썼 습 니 다. 중간 에 많은 오류 가 발생 했 습 니 다. 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 등 이 있 습 니 다.
 
 
 
 
 
 
 
 
 
 

좋은 웹페이지 즐겨찾기