본문 바로가기
공부/코딩 개념정리

[shell programming] awk linux 명령어 이해하기

by 소소하지만유니크한 2020. 12. 29.
728x90

이전 sed 명령어와 마찬가지로 아래의 포스트 내용 요약 및 추가한 것이다.

https://likegeeks.com/awk-command/

 

30 Examples for Awk Command in Text Processing - Like Geeks

awk command is powerful, learn how to read from a file, use data fields, built-in variables, data variables, formatted printing and built-in functions

likegeeks.com

 

awk 명령어는 sed 명령어 보다 데이터를 조작하기에 더 강력하며, 로그파일 등 백만개의 줄로 이루어진 파일을 읽을 수 있는 수준으로 만드는 데에 큰 강점을 가지고 있다.

 

awk 명령어를 가지고 할 수 있는 것은 아래와 같다.

  • 변수 선언.
  • 문자열 연산과 수학적 연산 사용.
  • 제어 흐름 및 반복문. 
  • 형식화된 문자열 출력.

기본 구조

$ awk options awk_script file

옵션은 아래와 같은 값을 가질 수 있다.

-F fs 분리기호 지정. 

-f file awk 스크립트 지정. 

-v var=value 변수 선언.

 

Read AWK Scripts

aws 스크립트는 ''(single quatation marks)로 둘러싸인 {} (braces)를 사용하여 표현한다.

$ awk '{print "Welcome to awk command tutorial "}'

위의 명령은 ""(double quatation marks)에 있는 문장을 출력해준다.

 

Using Variables

awk는 몇몇 변수에 대하여 지정된 필드가 존재한다. 

  • $0 는 전체 줄.
  • $1 첫번째 필드.
  • $2 두번째 필드.
  • $n n번째 필드

기본적으로 스페이스나 탭과 같은 whitespace 문자가 분리기호로 이용되어 필드를 나눈다. 

#myfile 내용

This is the first line.

This is the second line.

This is the third line.

This is the last line.

 

$ awk '{print $1}' myfile

위의 예시는 myfile 내용과 awk 명령어로 구성되어있는데, 명령어를 사용할 경우 결과는 자동적으로 모든 라인은 whitespace 문자들로 필드로 분리되고 각 라인마다 첫 번째 필드인 This가 출력된다.

 

Using Multiple Commands

sed로 여러 명령을 사용하고 싶을 경우, ;(semicolon)을 이용하면 된다.

$ echo "Hello Tom" | awk '{$2="Adam"; print $0}'

위의 명령어는 $2가 뜻하는 두 번째 필드가 "Adam"으로 변경되고 이후 다음 명령이 전체 라인($0)을 출력하는 것이므로 "Hello Adam"이 출력된다.

Reading The Script From a File

{print $1 " home at " $6}
$ awk -F: -f testfile /etc/passwd

 

 

 

**형식화된 여러 압축파일 풀기 예시

더보기

#!/bin/bash

 

echo "tar result" > ./tar_result.txt

echo "tar error" > ./tar_error.txt

 

IFS=$'\n'

for line in $(ls -1a *.tar.gz)

do

    SID=$(echo $line | awk -F'_' '{ print $5 }')

    echo $line >> ./tar_result.txt

 

    mkdir ./../submit_dir/${SID}_assign2

    tar -xvzf $line -C ./../submit_dir/${SID}_assign2 >> ./tar_result.txt 2>> ./tar_error.txt

done

#!/bin/bash

 

echo "tar result" > ./tar_result.txt

echo "tar error" > ./tar_error.txt

 

IFS=$'\n'

for line in $(ls -1a *.tar.gz)

do

    SID=$(echo $line | awk -F'_' '{ print $5 }')

    echo $line >> ./tar_result.txt

 

    mkdir ./../submit_dir/${SID}_assign2

    tar -xvzf $line -C ./../submit_dir/${SID}_assign2 >> ./tar_result.txt 2>> ./tar_error.txt

done

728x90

댓글