Linux

리눅스 명령어 3. sed, awk란?

Somaz 2024. 1. 20. 20:24
728x90
반응형

Overview

sed, awk 명령어에 대해서 알아보자.

  • Unix/Linux 환경에서 텍스트 처리를 소개하고 `sed`와 `awk`가 데이터 조작 및 작업 자동화에 중요한 역할을 하는 방법을 소개한다.

출처 : ChatGPT

 


Sed, Awk란?

 

Sed

`sed`는 주로 데이터 스트림(예: 파일 또는 파이프라인의 입력)의 텍스트를 구문 분석하고 변환하는 데 사용된다.

줄 단위로 문자와 함께 작동한다. 표준 입력이나 파일에서 텍스트를 입력 받아 데이터를 처리한다.

 

Awk

`awk`는 자료 처리 및 레포터 생성에 사용하는 프로그래밍 언어이다. 입력 데이터로 표준입력이나 여러개의 파일 또는 다른 프로세스의 결과를 사용할 수 있다.

데이터를 조작할 수 있기 때문에 Shell script 나 소규모 데이터베이스 관리에서 중요하게 사용된다. 사용자가 지정한 패턴 검색이나 특별한 작업을 수행하기 위해 파일을 행 단위로 조사한다.

특정한 작업(action)이 정의되지 않은 패턴에 대해서는 단지 출력만 한다. 패턴없이 action이 정의되면 해당 action에 의해 지정된 모든 행에 대해서 처리가 이루어진다.

 


 

Sed, Awk 사용법


 

Sed 사용법

 

1. 텍스트 편집

# example.txt 생성
cat <<EOF > example.txt
Hello World
Hello Somaz
Hello promi
EOF

# example.txt 파일의 hello를 hi로 바꿔서 출력해준다.
sed 's/Hello/Hi/' example.txt
Hi World
Hi Somaz
Hi promi

# 파일 내용은 바뀌지 않는다.
cat example.txt
Hello World
Hello Somaz
Hello promi

# 파일을 편집하려면 -i 옵션을 사용하면 된다.
sed -i 's/Hello/Hi/' example.txt

# 변경 된다.
cat example.txt
Hi World
Hi Somaz
Hi promi

 

 

2. 텍스트 편집 활용

# somaz가 들어간 파일을 여러개 생성한다.
cat <<EOF > example1.txt
Hello somaz
EOF

cat <<EOF > example2.txt
Hi somaz
EOF

cat <<EOF > example3.txt
Hu somaz
EOF

find . -type f -exec sed -i 's/somaz/somazx/g' {} +

# 해당 경로에 있는 파일들이 전부 변경된다.
cat example1.txt
Hello somazx

cat example2.txt
Hi somazx

cat example3.txt
Hu somazx

find

  • -type f
    • 해당 옵션은 파일(디렉토리 아님)을 찾도록 지시한다.
  • exec
    • 이 옵션을 사용하면 find에서 찾은 파일에 대해 다른 명령을 실행할 수 있다.

sed

  • sed -i
    • -i(in place) 옵션은 파일을 직접 수정하는데 사용되며, sed가 파일을 직접 수정한다.
  • s/somaz/somazx/g
    • 해당 부분은 somaz→somazx로 변경시켜주는 sed 명령어이다. 끝의 g는 각 행에서 전역적으로(즉, 첫 번째 행에서만 발생하는 것이 아니라 행의 모든 발생) 발생해야 한다는 것을 의미)한다.

{}

  • find 명령어에서 {} 기호는 명령이 찾는 각 파일 경로의 자리 표시자 역할을 한다. exec 옵션과 함께 find를 사용하여 다른 명령(sed와 같은)을 실행하면 {}이(가) 위치를 찾는 각 파일의 경로 바뀐다.

+

  • exec 명령어를 끝맺는다. 여러 파일 경로를 한 번에 sed에 전달할 수 있게 해주므로 각 파일에 대해 sed를 개별적으로 실행하는 것보다 효율적이다.


 

Awk 사용법

형식은 아래와 같다.

# awk로 시작하는 경우
awk 'PATTERN' 파일명 # 찾으려는 문자열(grep과 동일)
awk '{ACTION}' 파일명
awk '/PATTERN/ {ACTION}' 파일명 # 문자열일 경우 반드시 '/'을 삽입

# 명령어의 결과를 이용하는 경우
command | awk 'PATTERN'
command | awk '{ACTION}'
command | awk '/PATTERN/ {ACTION}'

# printf 변환문자
c - 문자
s - 문자열
d - 10진수
o - 8진수
x - 16진수

# printf 변경자
- : 왼쪽 정렬변경자
# : 선행하는 0은 8진수를 표시, 16진수는 0x 가 선행
+ : d,e,f,g 변환자와 함께 사용되어 +,- 부호를 붙여서 출력
0 : 공백대신 0을 출력

 

 

1. 텍스트 패턴 스캔 및 처리

# data.txt 파일 생성
cat <<EOF > data.txt
1,John,5000
2,Jane,5500
3,Doe,6000
EOF

# 첫째 열(ex.1,2,3) 제외하고 print
awk -F, '{print $2, $3}' data.txt
John 5000
Jane 5500
Doe 6000

 

2. 텍스트 패턴 스캔 및 처리 활용

# /etc/passwd 파일을 활용
cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...

# 1,2,6 열 출력
awk -F: '{print $1, $6, $7}' /etc/passwd
root /root /bin/bash
daemon /usr/sbin /usr/sbin/nologin
bin /bin /usr/sbin/nologin

# 특정사용자 1,2,6열 출력
awk -F: '/somaz/ {print $1, $6, $7}' /etc/passwd
somaz /home/somaz /bin/bash

# 특정단어 포함하여 1,2,6 열 출력
cat /etc/passwd | awk -F: '/somaz/ {print "계정명 : "$1" \\n" "홈디렉토리 : "$6" \\n" "쉘 : "$7 }'
계정명 : somaz
홈디렉토리 : /home/somaz
쉘 : /bin/bash

# /etc/passwd 에서 home이라는 문자열이 들어간 것들 중에 첫번째 구역을 출력한다
# 이때 grep '첫번째구역' /etc/shadow 와 같이 출력
# 첫번째 구역은 계정명 구역이므로 홈디렉토리(/home)를 가진 사용자를 출력하게 되는 것
grep home /etc/passwd | awk -F: '{print "grep "$1" /etc/shadow"}'

grep syslog /etc/shadow
grep somaz /etc/shadow
grep mongodb /etc/shadow

 

# 마운트 정보의 6번째 필드 내용 중에서 '/' 뒤에 's가 포함된 것을 출력
df -h | awk '{print $6}' | grep '\\/s'
/run/shm
/sys/fs/cgroup

# '/s'를 포함하는 모든 'df -h' 라인의 마운트 포인트를 출력 검색은 마운트 포인트 필드에만 국한되지 않는다.
df -h | grep '/s' | awk '{print $6}'
/
/run/shm
/sys/fs/cgroup

# 마운트 정보의 6번,5번 필드 내용을 번호를 매겨서 출력
df -h | awk '{print $6, $5}' | nl
     1  Mounted Use%
     2  /mnt/wsl 1%
     3  /usr/lib/wsl/drivers 67%
     4  / 27%
     5  /mnt/wslg 1%
     6  /usr/lib/wsl/lib 0%
     7  /init 1%
     8  /dev 0%
     9  /run 0%
    10  /run/lock 0%
    11  /run/shm 0%
    12  /run/user 0%
    13  /sys/fs/cgroup 0%
    14  /mnt/wslg/versions.txt 1%
    15  /mnt/wslg/doc 1%
    16  /mnt/c 67%
    17  /mnt/d 1%

# 특정 문서의 맨 뒤에 'sync'로 끝나는 라인을 출력
grep 'sync$' /etc/passwd
sync:x:4:65534:sync:/bin:/bin/sync

cat /etc/passwd | grep 'sync$'
sync:x:4:65534:sync:/bin:/bin/sync

 


 

Sed Awk 활용

# example.txt 생성
cat <<EOF > example.txt
1, John Doe, 30
2, Jane Smith, 25
3, Emily Davis, 40
EOF

sed 's/, */,/g' example.txt | awk -F, '$3 > 30 {print $2}'
Emily Davis
  • 텍스트 교체를 위해 sed 사용
    • sed 's/, */,/g' example.txt
      • 쉼표를 주변 공백(, *)으로 바꾸고 쉼표(``,`)만 사용한다.
    • sed의 s는 "대체"를 의미한다.
    • sed 명령 끝에 있는 g는 "전역"을 의미하며 각 줄의 모든 항목을 대체한다.
  • 데이터 추출을 위해 awk 사용
    • awk -F, '$3 > 30 {print $2}'
      • sed의 출력을 처리한다.
    • -F는 필드 구분 기호를 쉼표로 설정한다.
    • $3 > 30 {print $2}: 이 부분은 awk에게 세 번째 필드(연령)가 30보다 큰 경우 두 번째 필드(이름)를 인쇄하도록 지시한다.

 


Reference

https://wikidocs.net/29643

https://wikidocs.net/33828

728x90
반응형

'Linux' 카테고리의 다른 글

Vim 개념 및 사용가이드  (0) 2024.05.14
리눅스 명령어 2. jq란?  (2) 2024.01.19
리눅스 명령어 1. xargs란?  (0) 2024.01.16
Chattr 이란?  (0) 2022.07.25
CentOS 7 / 계정에 sudo 권한 주기  (0) 2022.04.28