본문 바로가기
네이버클라우드/Linux

Linux 8일차 (2023-05-03) Shell Script - sed 와 awk

by prometedor 2023. 5. 4.

sed

sed - stream editor

sed 는 비 대화형 편집기로서 grep 과 비슷하고, ed 에서 옴
ed 는 대화형 편집기
sed 는 스트리밍 편집기

차이 : 대화형은 입력, 출력이 하나로 이어짐

형식 : sed	[옵션]	[파일]

s/패턴/새로운 패턴/플래그


root@ysy:~/d80# cp /etc/services h
root@ysy:~/d80# cp /etc/passwd u
root@ysy:~/d80# ls
a.sh  func2  func2.sh  h  u

찾기, 출력
root@ysy:~/d80# sed '/oracle/p' h  --> 오라클 패턴 라인은 두 번 출력됨
root@ysy:~/d80# sed -n '/oracle/p' h  --> -n : 읽은 것을 출력하지 않음

root@ysy:~/d80# sed '/oracle/d' h  --> delete

root@ysy:~/d80# sed 's/ace/ACEACE/g' u  --> 치환
root@ysy:~/d80# sed 's/ace/ACEACE/g' u > u2  --> 치환 후 저장
root@ysy:~/d80# sed 's/ace/ACEACE/gw u3' u  --> 변경된 라인만 저장

root@ysy:~/d80# sed '/^$/p' h  --> 공백 라인만 뽑음

root@ysy:~/d80# cat -n h 

root@ysy:~/d80# sed '/^$/d' h | cat -n  -> 빈 줄 삭제

 

sed 플래그

숫자 : 몇 번째로 나타나는 패턴을 새롭게 바꿀지 결정
g : global 모든 패턴 변경
p : print 원본이 출력 되어야 함
d : delete 삭제
s : substitute 치환
w file 명 : 바꾼 결과를 새롭게 저장

 

sed 플래그

root@ysy:~/d80# sed -e 's/root/ROOT/g' -e 's/ace/ACEACE/g' u

--> u 파일에서 root 문자열을 ROOT로, ace 문자열을 ACEACE로 변경

 
 

awk

ㄴ 텍스트 파일에서 행 단위로 작업을 수행하는 유틸리티

리눅스 awk 는 gawk 심볼릭 링크임

awk 는 데이터를 조작하고 리포트를 생성하기 위해 사용함

패턴과 액션이 있음
awk '패턴 {action}' "파일명"

awk -F"[:]" '{print $1, $2, $7}'  /etc/passwd 


==> 필드를 구분하여 모두 출력
awk -F: '{print $1 " ==> " $7}'  /etc/passwd  --> 필드를 구분하여 모두 출력
root@ysy:~/d80# cat << END > a1  --> END 가 나오기 전까지의 입력을 a1 으로 저장
> 비빔밥
> 탕수육
> 짜장면
> 햄버거
> 설렁탕
> END
root@ysy:~/d80# nl a1
     1  비빔밥
     2  탕수육
     3  짜장면
     4  햄버거
     5  설렁탕

root@ysy:~/d80# cat << k > a2
> 6000
> 2000
> 3000
> 4000
> 5000
> k

root@ysy:~/d80# cat << y > a3
> 35
> 21
> 40
> 60
> 75
> y


root@ysy:~/d80# nl a1 a2 a3  --> a1, a2, a3 가 이어서 출력됨
     1  비빔밥
     2  탕수육
     3  짜장면
     4  햄버거
     5  설렁탕
     6  6000
     7  2000
     8  3000
     9  4000
    10  5000
    11  35
    12  21
    13  40
    14  60
    15  75

root@ysy:~/d80# nl a{1,2,3}  --> nl a1 a2 a3 와 같은 의미
     1  비빔밥
     2  탕수육
     3  짜장면
     4  햄버거
     5  설렁탕
     6  6000
     7  2000
     8  3000
     9  4000
    10  5000
    11  35
    12  21
    13  40
    14  60
    15  75

root@ysy:~/d80# paste a1 a2 a3 > aa  
--> a1, a2, a3 세 개의 파일을 세로 방향으로 이어 붙여서 하나의 파일인 aa를 생성
root@ysy:~/d80# nl aa
     1  비빔밥  6000    35
     2  탕수육  2000    21
     3  짜장면  3000    40
     4  햄버거  4000    60
     5  설렁탕  5000    75
     
root@ysy:~/d80# awk '{ print $1, $2, $3 }' aa  
--> aa 파일에서 각 라인의 첫 번째, 두 번째, 세 번째 필드를 출력
비빔밥 6000 35
탕수육 2000 21
짜장면 3000 40
햄버거 4000 60
설렁탕 5000 75

root@ysy:~/d80# awk '{ print $0 }' aa  --> aa 파일의 각 라인을 모두 그대로 출력
비빔밥  6000    35
탕수육  2000    21
짜장면  3000    40
햄버거  4000    60
설렁탕  5000    75

root@ysy:~/d80# awk '{ print }' aa  --> aa 파일의 각 라인을 모두 그대로 출력
비빔밥  6000    35
탕수육  2000    21
짜장면  3000    40
햄버거  4000    60
설렁탕  5000    75
root@ysy:~/d80# awk '{ print NR "\t" $0 }' aa 
1       비빔밥  6000    35
2       탕수육  2000    21
3       짜장면  3000    40
4       햄버거  4000    60
5       설렁탕  5000    75
--> aa 파일의 각 라인에 대해 라인 번호와 함께 출력
 
 
root@ysy:~/d80# awk '{ print $0 "필드수 ==> " NF }' aa 
비빔밥  6000    35필드수 ==> 3
탕수육  2000    21필드수 ==> 3
짜장면  3000    40필드수 ==> 3
햄버거  4000    60필드수 ==> 3
설렁탕  5000    75필드수 ==> 3
--> aa 파일의 각 라인에 대해 라인 내의 필드 수를 함께 출력


root@ysy:~/d80# awk -F '[:\t]' '/비빔밥/{ print NR "\t" $0 }' aa
1       비빔밥  6000    35
--> aa 파일에서 비빔밥이라는 문자열이 포함된 라인에 대해, 라인 번호와 함께 출력


root@ysy:~/d80# awk '/비/' aa 
비빔밥  6000    35
root@ysy:~/d80# awk '/탕수육/' aa
탕수육  2000    21
--> aa 파일에서 비라는 문자열을 포함한 모든 라인을 출력


root@ysy:~/d80# awk '$2 >= 4000' aa  --> 두번째 세로 라인 값이 4000 이상인 경우 출력
비빔밥  6000    35
햄버거  4000    60
설렁탕  5000    75


root@ysy:~/d80# awk '/[[:digit:]]/' aa  --> 숫자가 들었는지?
비빔밥  6000    35
탕수육  2000    21
짜장면  3000    40
햄버거  4000    60
설렁탕  5000    75


root@ysy:~/d80# awk '/[[:upper:]]/' aa  --> 대문자가 포함된 라인 찾아 출력
root@ysy:~/d80# awk '/[[:lower:]]/' aa  --> 소문자가 포함된 라인 찾아 출력
  
  
root@ysy:~/d80# df | awk '$4 > 3000000'  --> Avail 값이 3000000 보다 큰 경우 출력
Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/sda4       12278920   5377624   6255768  47% /
/dev/sda5        5074592      1460   4794604   1% /home
/dev/sda6       10215700      2072   9673112   1% /data
mywin          481352700 477775568   3577132 100% /media/sf_mywin

root@ysy:~/d80# find / -size +300M 2>/dev/null   --> size 가 300M 보다 큰 것 출력
/proc/kcore
--> 2>/dev/null : 에러 발생하는 것들 /dev/null 로 보냄

 
 
 
 

추가 실습 : ssh root  login 허용

root@ysy:~# cd /etc/ssh
root@ysy:/etc/ssh# ls
moduli         ssh_host_dsa_key        ssh_host_ed25519_key.pub
ssh_config     ssh_host_dsa_key.pub    ssh_host_rsa_key
ssh_config.d   ssh_host_ecdsa_key      ssh_host_rsa_key.pub
sshd_config    ssh_host_ecdsa_key.pub  ssh_import_id
sshd_config.d  ssh_host_ed25519_key
root@ysy:/etc/ssh# vi sshd_config

 

 

root@ysy:/etc/ssh# systemctl restart sshd
root@ysy:/etc/ssh# passwd
New password:
Retype new password:
passwd: password updated successfully

ㄴ root 패스워드 변경
 

ㄴ 변경해준 root 패스워드로 root 로그인 가능 확인