grep, cut, awk, sed 텍스트 처리

8437 단어
《 Linux Shell 스 크 립 트 공 략 》 노트, Chap - 4: 텍스트 날 리 기
간단 한 소개
셸 스 크 립 트 는 sed, awk, grep, cut 등 아름 다운 도 구 를 조합 하여 텍스트 처리 와 관련 된 문 제 를 해결 할 수 있 습 니 다.
정규 표현 식
정규 표현 식 은 텍스트 와 일치 하 는 형식 이 작고 맞 춤 형 프로 그래 밍 언어 입 니 다.어댑터 기술 만 으로 는 일치 할 수 있 는 텍스트 범위 가 상당히 제한 되 어 있 습 니 다.
정규 표현 식 기본 구성:
정규 표현 식
묘사 하 다.
^
줄 시작 표시
$
줄 끝 표시
.
임의의 문자 일치
[]
[] 에 포 함 된 임의의 문자 와 일치 합 니 다.
[^]
[^] 이외 의 임의의 문자 와 일치 합 니 다.
[-]
[] 범위 내의 임의의 문자 와 일치 합 니 다.

0 또는 1 회 반복
+
반복 > = 1 회
*
반복 > = 0 회
()
일치 하 는 하위 문자열 만 들 기
{n}
반복 n 회
{n, }
반복 > = n 회
{n,m}
n ~ m 회 반복
\
전의 문자
세로 줄
일치 하 는 세로 선 l 양쪽 임의의 항목
POSIX 문자 클래스
POSIX 문자 클래스 (POSIX character class) 는 특정한 문자 범위 와 일치 하 는 특수 원 시퀀스 입 니 다.
정규 표현 식
묘사 하 다.
밤.
[:alnum:]
알파벳 과 숫자 문자
[[:alnum:]]+
[:alpha:]
알파벳 문자
[[:alpha:]]{4}
[:blank:]
스페이스 바 와 탭 문자
[[:blank:]]*
[:digit:]
숫자 문자
[[:digit:]]?
[:lower:]
소문 자
[[:lower:]]{5,}
[:upper:]
대문자
([[:upper:]]+)?
[:punct:]
문장 부호
[[:punct:]]
[:space:]
모든 공백 문자
[[space:]]+
문자
메타 문자 (meta character) 는 Perl 스타일 의 정규 표현 식 으로 일부 텍스트 처리 도구 만 지원 합 니 다.
정규 표현 식
묘사 하 다.
밤.
\b
단어 경계
\ \ bcl \ \ b 는 cool 과 일치 하고 cooling 과 일치 하지 않 습 니 다.
\B
비 단어 경계
cool \ \ B 매 칭 cooling, cool 과 일치 하지 않 음
\d
단일 숫자 문자
b \ d 는 b2b 와 일치 하고 bcd 와 일치 하지 않 습 니 다.
\D
단일 비 숫자 문자
b \ \ Db 는 bcb 와 일치 하고 b2b 와 일치 하지 않 습 니 다.
\w
단일 단어 문자 (숫자, 자모 와)
\ w 일치 1 또는 a, 일치 하지 않 음 @
\W
단일 비 단어 문자
\ \ W 일치 @, 1 또는 a 와 일치 하지 않 음
\s
단일 공백 문자
x \ sx 매 칭 x x x, 일치 하지 않 음 xx
\S
단일 비 공백 문자
x \ \ Sx 는 xKx 와 일치 하고 xx 와 일치 하지 않 습 니 다.
줄 바 꿈 부호
새 줄 일치
\r
리 턴 카
\ r 매 칭 리 턴
#    ipv4  
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

#        
[\w]+@[\w]\.com

grep 로 파일 에서 텍스트 검색grep 명령 은 유 닉 스에 서 텍스트 검색 에 사용 되 는 도구 로 정규 표현 식 과 마스크 를 받 아들 일 수 있 습 니 다.
grep "    /   " file1 file2... --color=auto #      
grep -E "     " file
egrep "  " file

grep -v #    
grep -c #      
grep -n #        
grep -o #    
grep -l "  " file1 file2    #        
grep -R #    
grep -i #     
grep -e "  1" -e "  2"  #      
grep -f match.txt file1 # match.txt      
grep "  " --include=*.{sh,txt} --exclude=*.log --exclude-dir=/home/user -r /home    #       
-A/-B n #       /   n 
-C n    #        n 

cut 로 열 별로 파일 나 누 기cut 텍스트 를 열 에 따라 나 누 는 작은 도구 로 열 마다 경계선 을 지정 할 수 있 습 니 다.cut 용어 에 서 는 열 마다 필드 가 있 습 니 다.
#   '\t'  cut      
cut -d' ' -f1 1.txt #-d     ,-f       
cut -f1,2,3 #  1,2,3 
-c  ;   -b  ;
cut -c 1-5 1.txt    #  1-5  
cut -c -2 1.txt #   2   
cut -c 3-   #   3      

특정 파일 의 단어 주파 수 를 통계 하 다.
#            ,       sed,awk,grep      
#     ,         ,         
egrep -o "\b[:alpha:]+\b"   #    

sed 입문sed 는 stream editor (스 트림 편집기) 의 줄 임 말로 텍스트 처리 에서 매우 중요 한 도구 입 니 다.정규 표현 식 에 완벽 하 게 맞 춰 사용 할 수 있 습 니 다.
#sed - stream editor for filtering and transforming text
#  / sed        

#  
#sed 's/    /     /'
sed 's/pattern/repalce/' file   #  
sed -i 's/pattern/repalce/' file    #      file

echo "1.txt" > 1.txt && sed 's/txt/haha' 1.txt  #     haha  txt
sed -i 's/txt/haha/' 1.txt  # 1.txt    txt haha   
#-i       

echo "hahaha" | sed 's/ha/HA/g' #    
echo "hahaha"   | sed 's/ha/HA/2g'  #      ,  2      

#        
sed '/pattern/d
sed '/^$/d' ##     

# sed  &        
echo "A wonderful goal" | sed 's/\w\+/[&]/g'    #\w\+       

#      \1,\2...
echo "1st 2nd 3rd" | sed 's/\(\w\+\) \(\w\+\) \(\w\+\)/\2 \1 \3/'
2nd 1st 3rd
# \2 \1    ,(),+  sed    ,     

#       
sed 'expression1; expression2; ...
echo "aabbcc" | sed 's/a/A/; s/b/B/; s/c/C/g'
AaBbCC

#    " "       ( $ ),         
#    ' '              (   )
#  
text=hello
echo 'hello world' | sed "s/$text/HELLO/"
HELLO world

awk 입문awk 데이터 흐름 에 사용 하도록 설계 되 어 열 과 줄 을 조작 할 수 있다.
#awk ‘begin{print "start"} pattern {command} end{print "end"}’ file
awk '{sum += $1}; {print sum}'
#awk   :begin 、end       (pattern)           
#3        
#awk    stdin     
cat /etc/passwd | awk -F: '{print $1}'  #-F     

#awk      
#NR:    (number of records),       
#NF:    (number of fields),          
#$0:             
#$1,$2...$NF: 1 /2 .../          
echo -e "L1 1
L2 22
L3 333" | awk '{print NR NF $0 $1 $2}' # NR NF $0 $1 $2 $NF= =$2 1 2 L1 1 L1 1 1 2 2 L2 22 L2 2 2 3 2 L3 333 L3 3 3 # awk #-v awk # -v var=val --assign=var=val var='12345' echo | awk -v v1=$var '{print v1}' # var1=111; var2=222 echo | awk '{print v1,v2}' v1=$var1 v2=$var2 # awk '{print v1,v2}' v1=$var1 v2=$var2 file # awk awk 'NR < 3,NR==4' 1.txt # <5 awk '/linux/' 1.txt # linux ( re) awk '!/linux/' 1.txt #! linux # awk -F: '{print $1}' /etc/passwd awk '{FS=":"} {print $1}' /etc/passwd awk '{FS=":"; print $1}' /etc/passwd # awk , getline echo | awk '{"grep root /etc/passwd" | getlin out; print out}' root:x:0:0:root:/root:/bin/bash # awk awk '{for(i=1;i<4;i++) {print $i}}' 2.txt # 1,2,3

파일 의 줄, 단어, 문 자 를 교체 합 니 다.
#         
echo -e "1
22
333" | while read line;do echo $line;done grep "bash" /etc/passwd | while read line;do echo $line;done #1 #22 #333 # echo "1 22 333" | while read line;do for word in $line;do echo $word;done;done #1 #22 #333 # echo "abc" | while read line; do for word in $line; do for((i=0;i

열 별로 파일 병합paste 명령 을 사용 하여 열 연결 을 실현 할 수 있 습 니 다.
#paste - merge(  ) lines of files
echo -e  "1
2
3" > 1.txt && echo -e "Line1
Line2
Line3" > 2.txt paste 1.txt 2.txt 1 Line1 2 Line2 3 Line3 # , -d paste 1.txt 2.txt -d','

파일 이나 줄 의 n 번 째 단어 나 n 열 을 인쇄 합 니 다.
awk -F':' '{print $1,$3}' file1
cut -d':' -f 1,3 file1

동행 하지 않 거나 스타일 사이 의 텍스트 인쇄
awk 'NR==1,NR==10' /etc/passwd
awk 'NR==1,NR==10' /etc/passwd | awk -F":" '{print $1,$NF}' #          

awk '/start_pattern/, /end_pattern/' file   #  start end     ,   re
awk '/root/, /zhang/' /etc/passwd   #  root zhang    
awk '/^ro.?t/, /bash$/' /etc/pass

역순 으로 줄 인쇄
사용 가능 awk, tac 완료.tac 는 거꾸로 cat 입 니 다.
#tac -          ,        tac    
tac 1.txt
awk '{lifo[NR]=$0; lno=NR} END{ for(;lno>-1;lno--) {print lifo[lno]};}' 1.txt

텍스트 의 전자 우편 과 URL 분석
주어진 파일 에서 필요 한 텍스트 를 분석 하 는 것 은 우리 가 텍스트 처리 에 종사 할 때의 작업 입 니 다.
#egrep

#        
egrep -o '[a-zA-Z0-9.]+@[0-9a-zA-Z.]+\.[a-zA-Z]{2,4}' emails.txt

#    URL  
egrep -o "http://[a-zA-Z0-9.]+\.[a-zA-Z]{2,3}" urls.txt

어떤 스타일 을 인쇄 하기 전 / 이후 n 줄
grep "zhang" /etc/passwd -A 5   #Ater
grep "zhang" /etc/passwd -B 5   #Before
grep "zhang" /etc/passwd -C 5   #       

파일 에서 어떤 단 어 를 포함 하 는 문장 을 제거 합 니 다.
올 바른 정규 표현 식 (Regular Expression) 만 쓸 수 있다 면 손 쉽게 잡 을 수 있다.
sed 's/[^.]*handsome boy[^.]*\.//g' file.txt    #   .  

텍스트 절편 과 매개 변수 조작
#            
var="One two three"
echo ${var/t/T} #      
#One Two three

#            
#${  :    :  }
${vari:start:length}
echo {var:0:2}  #On
echo {var:1:6}  #ne two

#        0,           -1
echo ${var:(-1)}    #e
echo ${var:(-3):3}  #ree

좋은 웹페이지 즐겨찾기