셸 스 크 립 트 학습 - 정규 표현 식, sed, awk

1. 정규 표현 식 정규 표현 식 은 지정 한 문자 와 일치 하 는 정규 표현 식 을 지원 하 는 프로그램 을 찾 는 데 사 용 됩 니 다. locate, find, vim, grep, sed, awk 메타 문자: 특별한 의 미 를 가 진 전용 문자, 예 를 들 어. *?선도 문자: 원 문자 앞 에 있 는 문자, 예 를 들 어 abc * 1, 첫 번 째 정규 표현 식
        
.                     
*            0      
.*           
^        
$        
^$       
[]                       
[^]                         
^[]                         
^[^]                         

       
\<                 
\>                 
\< \>             
\{n\}                 n 
\{n,\}                n 
\{n,m\}             n~m 
\( \)               
\d              (grep -P)        [0-9]
\w                   (grep -P) [a-zA-Z0-9_]
\s              、   、   (grep -P) [\t\r
] grep -E egrep sed -r + ? 0 | () ( ) {n} n {n,} n {n,m} n~m

2. 두 번 째 정규 표현 식
[:alnum:][[:alnum:]]+
[:alpha:]          (   )  [[:alpha:]]{4}
[:blank:]              [[:blank:]]*
[:digit:]            [[:dight:]]?
[:lower:]              [[:lower:]]{4,}
[:upper:]             [[:upper:]]+
[:punct:]              [[:punct:]]
[:space:][[:space:]]+

명령 행 형식
sed [options] '    '    
-e         
-n         
-r            
-i       (     )
-f     sed     

      
'p'       
'i'               
'a'               
'c'              
'd'          

           
  :sed    ‘  +  ’        
      
sed '' a.txt
sed -n '2p' a.txt
sed -n '1,5p' a.txt
sed -n '$p' a.txt
      
sed '2ihello world' a.txt
sed '3ihello
world'
a.txt sed '2,4a999' a.txt sed '$chello world' a.txt sed '/^adm/chello world' a.txt sed '1,5chello world' a.txt 1~5 hello world sed '1,4d' a.txt sed -r '/([0-9]{1,3}\.){3}[0-9]{1,3}/d' a.txt

파일 검색 교체 작업
  :sed    ‘s/     /     /  ’        
s    ;/     ,    ;     p     g
sed -n 's/root/ROOT/p' 1.txt
sed -n 's/root/ROOT/gp' 1.txt
sed -n 's/^#//gp' 1.txt    # 
sed -n 's@/sbin/nologin@hello@gp' 1.txt
sed -n '10s@/sbin/nologin@hello@gp' 1.txt    10 
sed -n '1,5s/^/#/gp' 1.txt
sed -n 's#\(10.1.1.\)1#\1254#gp' 1.txt

기타 명령
r               
w          
&      \(\)  
=         
!                   ,      
q       
sed '3r /etc/hosts' 1.txt               
sed '1,5w 11.txt' 1.txt              
sed -n 's/^sync/#&/gp' 1.txt   sync     
sed -ne '/root/p' -ne '/root/=' 1.txt      ,      
sed -n '/root/=;/root/p' 1.txt
sed -n '1,5!p' 1.txt      1~5 
sed '/shutdown/q' 1.txt     shutdown   

기타 옵션
-e          
-r          
-i           
grep -v '^#' vsftpd.conf |grep -v '^$'              
sed -e '/^#/d' -e '/^$/d' vsftpd.conf
sed -e '/^#/d;/^$/d' vsftpd.conf
sed -r '/^#|^$/d' vsftpd.conf
sed -i 's/root/ROOT/g' 1.txt

sed 결합 정규 사용
sed    ‘sed               ’    
/key/      sed -n '/root/p' 1.txt           
/key1/,/key2/   sed -n '/^adm/,/^mysql/p' 1.txt                  
/key/,x      sed -n '/^ftp/,7p' 1.txt             x 
x,/key/
x,y!              x y 
/key/!    sed -n '/bash$/!p' 1.txt           

2. 스 크 립 트 형식
sed -f scripts.sh file
./sed.sh file

#!/bin/sed -f
1,5d
s/root/ROOT/g
3i777
5i888
a999
p

  :       sed      ;
               、        
                 
          
     #        

3. awk 1. 문법 구조:
awk    '    '        (  shell       )
-F          ,        
-v          
      :
     ,    
'/root/{awk  }'        sed '/root/p'
'NR==1,NR==5{awk  }'         '1,5p'
'/^root/,/^ftp/{awk  }'      '/^root/,/^ftp/p'
{awk  1;awk  2;...}
'{print $0;print $1}'         'p'
'NR==5{print $0}'             '5p'
#awk        
BEGIN...END...
'BEGIN{awk  };{   };END{awk  }'
'BEGIN{awk  };{   }'
'{   };END{awk  }'

2. 스 크 립 트 모드
#!/bin/awk -f
#  awk             ,          
BEGIN{FS=":"}
NR==1,NR==3{print $1"\t"$NF}
...

    
   :
awk    -f awk             
awk -f awk.sh filename
awk -f awk.sh -i filename
   :
./awk    (     )       
./awk.sh filename

3. awk 내부 관련 변수
$0                 
$1,$2,$3...$n                   awk -F:'{print $1,$3}'
NF               (  )  awk -F: '{print NF}'
$NF              $(NF-1)                        
FNR/NR      
FS                 'BEGIN{FS=":"};{print $1,$3}'
OFS              ,      'BEGIN{OFS="\t"};{print $1,$3}'
RS             ,      'BEGIN{RS="\t"};{print $0}'
ORS            ,      'BEGIN{PRS="

"};{print $1,$3}'
FILENAME

4 、 awk 사용 진급
     print printf
print         echo
date |awk '{print "Month: "$2 "
Year: "$NF}'
printf echo -n awk -F: '{printf "%-15s %-10s %-15s
", $1,$2,$3}'
/etc/passwd awk -F: '{printf "|%-15s| %-10s| %-15s|
", $1,$2,$3}'
/etc/passwd awk awk -v NUM=3 -F: '{print NUM}' 1.txt awk -v NUM=3 'BEGIN{print NUM}' #awk $ awk BEGIN...END BEGIN END 'BEGIN{ };{ }:END{ }'awk -F: 'BEGIN{print "Login_shell\t\tLogin_home
*************"};{print $NF"\t\t"$(NF-1)};END{print "*************"}'
1.txt 2、 /etc/passwd 、 、 shell awk -F: 'BEGIN{OFS="\t\t";print "u_name\t\th_dir\t\tshell
****************"};{printf "%-20s %-20s %-20s
",$1,$(NF-1),$NF};END{print "******************"}'
/etc/passwd awk == != > < >= <= ~ !~ ! && || awk -F: 'NR==1,/^lp/{print $0}' passwd awk -F: '/^root/ || /^lp/{print $0}' passwd awk 'NR>=30 && NR<=39 && $0 ~ /bash$/{print $0}' passwd ip ifconfig eth0 |grep Bcast|awk -F: '{print $2}' |awk '{print $1}' ifconfig eth0 |grep Bcast|awk -F'[: ]+' '{print $4}' ifconfig eth0 |awk -F"[: ]+" '/inet addr/{print $4}'

5. awk 스 크 립 트 프로 그래 밍 프로 세 스 제어 문
if  
  :awk    '  ,    {awk  }'    
  {if(   ) (  1;  2;...)}
awk -F: '{if($3==0) {print $1"    "}}' passwd
awk 'BEGIN{if($(id -u)==0) {print "admin"}}'

if...else  
  :{if(   ) {  ;  ;...} else {  ;  ;...}}
awk -F: '{if($3>=500 && $3 !=65534) {print $1"     "} else {print $1"      "}}' passwd
awk 'BEGIN{if($(id -u)>=500 && $(id -u) !=65534) {print "     "} else {print "      "}}'

if...else if...else  
  :{if(   1) {  ;  ;...} else if(   2) {  ;  ;...} else if(   3) {  ;  ;...} else {  ;  ;...}}
awk -F: '{if($3==0) {print $1"is admin"} else if($3>=500 && $3<=60000) {print $1"is normal user"} else {print $1"is system user"}}' passwd
awk -F: '{if($3==0) {i++} else if($3>=1 && $3<=499 || $3==65534) {j++} else {k++}};END{print "      :"i"
:"j"
:"k}'
passwd

순환 문
for  
awk 'BEGIN{for(i=1;i<=5;i++) {print i}}'
awk 'BEGIN{sum=0;for(i=1;i<=10;i+=2) sum=sum+i;{print sum}}'
for ((i=1;i<=10;i+=2));do echo $i;done|awk '{sum+=$0};END{print sum}'

while  
awk 'BEGIN{i=1;while(i<=5) {print i;i++}}'
awk 'BEGIN{sum=0;i=1;while(i<=10) {sum=sum+i;i+=2};{print sum}}'

    
awk 'BEGIN{for(y=1;y<=5;y++) {for(x=1;x<=y;x++) {printf x};print}}'
1
12
123
1234
12345
99    
awk 'BEGIN{for(y=1;y<=9;y++) {for(x=1;x<=y;x++) {k=y*x;printf (x"*"y"="k"\t")};print ("
")}}'

awk 산수 연산
+ - * / %( ) ^( 2^3)
awk 'BEGIN{print 1+1}'
awk 'BEGIN{print 2**3}'
awk 'BEGIN{print 2/3}'

6. awk 연습 - 통계
      shell
awk -F: '{shells[$NF]++};END{for (i in shells) {print i,shells[i]}}' /etc/passwd

        
ss -antp|grep 80|awk '{states[$1]++};END{for (i in states) {print i,states[i]}}'
ss -an|grep :80|awk '{states[$2]++};END{for (i in states) {print i,states[i]}}'|sort -k2 -rn

         IP  
netstat -ant|grep :80|awk -F: '{ip_count[$8]++};END{for (i in ip_count) {print i,ip_count[i]}}'|sort
ss -an|grep :80|awk -F: '!/LISTEN/{ip_count[$(NF-1)]++};END{for (i in ip_count) {print i,ip_count[i]}}'|sort -k2 -rn|head

      PV 
  Apache/Nginx      PV 
grep '24/May/2020' mysqladmin.cc-access_log |wc -l
  Apache/Nginx        IP   
grep '24/May/2020' mysqladmin.cc-access_log|awk '{ips[$1]++};END{for (i in ips) {print i,ips[i]}}'|sort -k2 -rn|head
grep '24/May/2020' access_log|awk '{ips[$1]++};END{for (i in ips) {print i,ips[i]}}'|awk '$2>100'|sort -k2 -rn
*****      *****
     (PV)       ,           1 PV;
    (VV)                   1   ,  30           ,      ,       ;
    (UV)1             1 UV;
  IP(IP)1      IP            ,  IP      ,  IP  1。

7. 실전 연습 (로그 덤 프) 요구: 각 웹 서버 의 apache 방문 로 그 를 최근 3 일 동안 유지 하고 3 일 전의 로 그 를 전문 로그 서버 에 저장 해 야 합 니 다. 어떻게 서버 마다 3 일 이내 의 로 그 를 유지 합 니까?1. 모든 웹 서버 로 그 는 로그 서버 에 해당 하 는 디 렉 터 리 입 니 다.2. 각 웹 서버 는 3 일간 의 방문 로 그 를 보관 합 니 다. 3 일 전의 로 그 는 매일 새벽 5: 00 에 로그 서버 로 저장 합 니 다. 3. 스 크 립 트 저장 에 실 패 했 습 니 다. 운영 자 는 발판 메뉴 를 통 해 수 동 으로 로 그 를 정리 해 야 합 니 다.
1)apache        :
vim /usr/local/apache2/conf/extar/http-vhosts.conf
...
ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/error_log-%Y%m%d 86400"
CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_log-%Y%m%d 86400" common
...

  :
1.rotatelogs   apache         ,-l                 ,  GMT    
2./usr/local/apache2/logs/access_log-%Y%m%d 86400             ,  86400             s,24   

2)log-server   rsync,ip 10.1.1.2
cat /etc/rsyncd.conf
[web1]
path = /web1/logs
uid = root
gid = root
read only = false

[web2]
path = /web2/logs
uid = root
gid = root
read only = false

echo rsync --daemon >> /etc/rc.local

3)web          
#!/bin/bash
#clean log
clean_log(){
remote_log_server=10.1.1.2
server=$1
log_dir=/usr/local/apache2/logs
log_tmp_dir=/tmp/log
host=`ifconfig eth0|sed -n '2p'|awk -F'[ :]+' '{print $4}'`

[!-d $log_tmp_dir] && mkdir -p $log_tmp_dir

cd $log_dir
find ./ -daystart -mtime +3 -exec tar -uf $log_tmp_dir/`echo $host`_$(date +%F).tar{}\;
find ./ -daystart -mtime +3 -delete

cd $log_tmp_dir
rsync -a ./ $remote_log_server::$server && find ./ -daystart -mtime +1 -delete
}

4)jumper-server
#!/bin/bash
#jumper-server
#    
trap '' 1 2 3
menu1(){
   cat <<-END
       web1     :
   1.clean_apache_log
   2.reload_apache_service
   3.test_apache_service
   4.remote login
   END
}
menu2(){
   cat <<-END
             :
   1.DB1-Master
   2.DB2-Slave
   3.Web1
   4.Web2
   5.exit
   END
}

push_pubkey(){
ip=$1
#          ,       
[!-f ~/.ssh/id_rsa.pub] && ssh-keygen -P "" -f ~/.ssh/id_rsa &>/dev/null
#  expect  ,       
sudo rpm -q expect &>/dev/null
test $? -ne 0 && sudo yum -y install expect
#     yunwei              
/usr/bin/expect <<-EOF
spawn ssh-copy-id -i root@$ip
expect{
"yes/no" {send "yes\r";exp_continue}
"password:" {send "123456\r"}
}
expect eof
EOF
}
while true
do
menu2
#         
read -p "         :" host
case $host in
     1)
     ssh [email protected]
     ;;
     2)
     ssh [email protected]
     ;;
     3)
     clear
     menu1
     read -p "          :" action
     case $action in
          1)
          ssh [email protected] clean_log web1
          test $? -eq 0 && ech "      ..."
          ;;
          2)
          service apache reload
          ;;
          3)
          wget http://10.1.1.1 &>/dev/null
          test $? -eq 0 && echo "web      ..."|| echo "web      ,   ..."
          ;;
          4)
          ssh [email protected]
          ;;
          "")
          :
          ;;
     esac
     ;;
     5)
     exit
     ;;
     *)
     clear
     echo "    ,     ..."
     ;;
esac
done 

좋은 웹페이지 즐겨찾기