아이티윌_데이터 분석 55기/강의내용_Linux

#7 7일차_반복 제어문, sed, awk

ecosso 2026. 7. 23. 12:54

01 반복 제어문

 

02 sed - 비대화형 편집기

 

03 awk - 자료처리

 -01 산술연산

 -02 grep

 -03 cut


01 반복 제어문

 - continue

 특정 조건을 만나면 반복문 스킵, 다음 대상부터 다시 반복문을 수행한다.

 

ex)

for fname in $(ls *.sh)

do

  if [ $fname = "a.sh" ]

  then

    exit 1

  echo "$fname"

done

echo "프로그램 종료"

exit 0

 

vi 22_continue.sh

#!/bin/sh

for i in $(seq 1 10)
do
  echo "숫자 출력"
  if [ $i -eq 5 ]
  then
    continue
  fi
  echo "현재번호 : $i"
done
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ sh 22_continue.sh
숫자 출력
현재번호 : 1
숫자 출력
현재번호 : 2
숫자 출력
현재번호 : 3
숫자 출력
현재번호 : 4
숫자 출력
숫자 출력
현재번호 : 6
숫자 출력
현재번호 : 7
숫자 출력
현재번호 : 8
숫자 출력
현재번호 : 9
숫자 출력
현재번호 : 10

 

break 실습으로 변경해보았다.

#!/bin/sh

for i in $(seq 1 10)
do
  echo "숫자 출력"
  if [ $i -eq 5 ]
  then
    break
  fi
  echo "현재번호 : $i"
done
echo "프로그램 종료"
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ sh 22_continue.sh
숫자 출력
현재번호 : 1
숫자 출력
현재번호 : 2
숫자 출력
현재번호 : 3
숫자 출력
현재번호 : 4
숫자 출력
프로그램 종료

 

vi 23_menu.sh

#!/bin/sh

# env
dir=/home/itwill/linux_ex/ch8
todate=`date +%Y%m%d`

# function def
f_menu() {
  echo "메뉴를 입력하세요(p:prior, q:quit) ☞ \c"
  read ans2
  case $ans2 in 
    p|P)
      echo "이전 메뉴로 돌아가겠습니다\c"
      for i in . . .
      do
        echo "$i\c"
        sleep 1
      done
      contitue
      ;;
    q|Q)
      echo "프로그램을 종료하겠습니다\c"
      for i in . . .
      do
        echo "$i\c"
        sleep 1
      done
      break
      ;;
    *)
      echo "잘못 입력되었습니다. 프로그램을 종료합니다."
      exit 1
      ;;
  esac
}

f_wait() {
  for i in . . .
  do
    echo "$i\c"
    sleep 1
  done
  echo
}

# main shell
clear

while [ 1 ]
do
  clear
  echo "┌─────────────────────────┐"
  echo "│       관리자 화면       │"
  echo "└─────────────────────────┘"
  echo "┌─────────────────────────┐"
  echo "│  1. 유저 확인           │"
  echo "│  2. 파일 확인           │"
  echo "└─────────────────────────┘"
  echo
  echo "메뉴를 입력하세요(q:quit) ☞ \c"
  read ans

  case $ans in
    1)
      echo "유저 확인 화면으로 전환됩니다\c"
      f_wait              # 대기 프롬프트 출력

      clear
      echo "┌─────────────────────────┐"
      echo "│        유저 확인        │"
      echo "└─────────────────────────┘"
      echo 

      echo "유저명을 입력하세요 ☞ \c"
      read username

      if grep -w ^$username /etc/passwd > /dev/null
      then
        hdir=`grep -w ^$username /etc/passwd | cut -d: -f6`
        shell=`grep -w ^$username /etc/passwd | cut -d: -f7`
        echo
        echo "〓〓〓〓〓〓 결과 〓〓〓〓〓〓"
        echo
        echo "사용자명   : $username"
        echo "홈디렉토리 : $hdir"
        echo "로긴쉘     : $shell"
        echo
        echo "〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓"
        echo
        f_menu                # 이전으로 돌아가기, 프로그램 종료 메뉴 출력
      else
        echo "$username 유저가 존재하지 않습니다."
        exit 1
      fi
      ;;
    2) 
      echo "파일 확인 화면으로 전환됩니다\c"
      f_wait              # 대기 프롬프트 출력

      clear
      echo "┌─────────────────────────┐"
      echo "│        파일 확인        │"
      echo "└─────────────────────────┘"
      echo 

      echo "파일명을 입력하세요 ☞ \c "
      read fname
      
      if [ -f $fname ]
      then
        fsize=`ls -l $fname | cut -d" " -f5`
        fown=`ls -l $fname | cut -d" " -f3`
        echo
        echo "〓〓〓〓〓〓 결과 〓〓〓〓〓〓"
        echo
        echo "파일명 : $fname"
        echo "소유자 : $fown"
        echo "크기   : $fsize"
        echo
        echo "〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓"
        echo
        f_menu
      else
        echo "$fname 파일이 존재하지 않습니다."
      fi
      ;;
    q|Q)
      echo "프로그램을 종료하겠습니다\c"
      f_wait
      break
      ;;
    *)
      echo "잘못된 입력입니다."
      echo "프로그램을 종료하겠습니다\c"
      f_wait
      exit 1
      ;;
  esac
done

echo "프로그램 정상 종료"
┌─────────────────────────┐
│       관리자 화면       │
└─────────────────────────┘
┌─────────────────────────┐
│  1. 유저 확인           │
│  2. 파일 확인           │
└─────────────────────────┘

메뉴를 입력하세요(q:quit) ☞ 2

┌─────────────────────────┐
│        파일 확인        │
└─────────────────────────┘

파일명을 입력하세요 ☞ /home/itwill/linux_ex/ch9/23_menu.sh

〓〓〓〓〓〓 결과 〓〓〓〓〓〓

파일명 : /home/itwill/linux_ex/ch9/23_menu.sh
소유자 : itwill
크기   : 3696

〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

메뉴를 입력하세요(p:prior, q:quit) ☞

02 sed - 비대화형 편집기

동시에 여러 파일을 vi 편집기 없이 수정이 가능한 기능이다.

명령어로 파일 편집이 가능하다 (글자입력, 행 삭제, 글자 치환 등)

 

* 사용법

sed [옵션] '명령어' 파일명

 

* 명령어

읽기(r)

출력(p)

삭제(d)

입력(i,a)

치환(s)

 

* 옵션

-n : 원하는 라인만 출력

-e : 다중편집

 

ex)

d)

set '5d' test.txt  -> 5번행 삭제

sed '1,5d' test.txt  -> 1~5행 삭제

sed '/root'd' test.txt  -> root가 포함된 행 삭제

sed 'root/!d' test.txt  -> root가 포함되지 않은 행 삭제

sed '/^#/d' test.txt  -> 주석처리된 행 삭제

sed /^$/d' test.txt  -> 빈줄 삭제

itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ cat -n /etc/passwd | head -10
     1  root:x:0:0:root:/root:/bin/bash
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
     3  bin:x:2:2:bin:/bin:/usr/sbin/nologin
     4  sys:x:3:3:sys:/dev:/usr/sbin/nologin
     5  sync:x:4:65534:sync:/bin:/bin/sync
     6  games:x:5:60:games:/usr/games:/usr/sbin/nologin
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
     8  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
     9  mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    10  news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
    
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ cat -n /etc/passwd | head -10 > test.txt

itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ sed '5d' test.txt
     1  root:x:0:0:root:/root:/bin/bash
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
     3  bin:x:2:2:bin:/bin:/usr/sbin/nologin
     4  sys:x:3:3:sys:/dev:/usr/sbin/nologin
     6  games:x:5:60:games:/usr/games:/usr/sbin/nologin
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
     8  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
     9  mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    10  news:x:9:9:news:/var/spool/news:/usr/sbin/nologin


itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ sed '1,5d' test.txt
     6  games:x:5:60:games:/usr/games:/usr/sbin/nologin
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
     8  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
     9  mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    10  news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$

itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ sed '/root/d' test.txt
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
     3  bin:x:2:2:bin:/bin:/usr/sbin/nologin
     4  sys:x:3:3:sys:/dev:/usr/sbin/nologin
     5  sync:x:4:65534:sync:/bin:/bin/sync
     6  games:x:5:60:games:/usr/games:/usr/sbin/nologin
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
     8  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
     9  mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    10  news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

 

주석처리된 라인도 삭제할 수 있다.

itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ cat test.txt
     1  root:x:0:0:root:/root:/bin/bash
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
     3  bin:x:2:2:bin:/bin:/usr/sbin/nologin
     4  sys:x:3:3:sys:/dev:/usr/sbin/nologin
#     5 sync:x:4:65534:sync:/bin:/bin/sync
#     6 games:x:5:60:games:/usr/games:/usr/sbin/nologin
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
     8  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
     9  mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    10  news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ sed '/^#/d' test.txt
     1  root:x:0:0:root:/root:/bin/bash
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
     3  bin:x:2:2:bin:/bin:/usr/sbin/nologin
     4  sys:x:3:3:sys:/dev:/usr/sbin/nologin
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
     8  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
     9  mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    10  news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

 

ex)

p)

sed '5p' test.txt -> 5번 행이 한 번 더 출력

sed -n '5p' 'test.txt -> 5번행만 출력

sed -n '/root/p/ test.txt -> root 단어가 포함된 라인만 출력

sed -n '/^$/p' test.txt | wc -l -> 빈 줄의 수 출력

itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ set '5p' test.txt
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ sed -n '5p' test.txt
#     5 sync:x:4:65534:sync:/bin:/bin/sync

 

ex)

s)

sed 's/nologin//' test.txt -> 전체 범위에서 nologin 단어 삭제
sed '2s/nologin//' test.txt -> 2번 행의 nologin 단어 삭제

sed '2,5s/nologin//' test.txt -> 2~5번 행의 nologin 단어 삭제
sed '2,5!s/nologin//' test.txt -> 2~5번 행을 제외한 나머지 행에서 nologin 단어 삭제
sed '3s/bin/BIN/' test.txt -> 2~5번 행을 제외한 나머지 행에서 nologin 단어 삭제
sed '3s/bin/BIN/' test.txt -> 3번행에서 bin을 BIN으로 치환(첫번째 단어만 치환됨)
sed '3s/bin/BIN/g' test.txt -> 3번행에서 bin을 BIN으로 치환(모든 단어가 치환됨)

sed '1,2s/%/#3/' text.txt -> 1~2번행 주척처리

sed '5,6s/^#//' test.txt -> 5~6번행 주석해지

sed '1,3s/^/  /' test.txt -> 1~3번행 두 칸 들여쓰기

itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ cat test.txt
     1  root:x:0:0:root:/root:/bin/bash
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
     3  bin:x:2:2:bin:/bin:/usr/sbin/nologin
     4  sys:x:3:3:sys:/dev:/usr/sbin/nologin
#     5 sync:x:4:65534:sync:/bin:/bin/sync
#     6 games:x:5:60:games:/usr/games:/usr/sbin/nologin
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
     8  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
     9  mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    10  news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
    
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ sed 's/nologin//' test.txt
     1  root:x:0:0:root:/root:/bin/bash
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/
     3  bin:x:2:2:bin:/bin:/usr/sbin/
     4  sys:x:3:3:sys:/dev:/usr/sbin/
#     5 sync:x:4:65534:sync:/bin:/bin/sync
#     6 games:x:5:60:games:/usr/games:/usr/sbin/
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/
     8  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/
     9  mail:x:8:8:mail:/var/mail:/usr/sbin/
    10  news:x:9:9:news:/var/spool/news:/usr/sbin/
    
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ sed '2s/nologin//' test.txt
     1  root:x:0:0:root:/root:/bin/bash
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/
     3  bin:x:2:2:bin:/bin:/usr/sbin/nologin
     4  sys:x:3:3:sys:/dev:/usr/sbin/nologin
#     5 sync:x:4:65534:sync:/bin:/bin/sync
#     6 games:x:5:60:games:/usr/games:/usr/sbin/nologin
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
     8  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
     9  mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    10  news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
    
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ sed '2,5!s/nologin//' test.txt
     1  root:x:0:0:root:/root:/bin/bash
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
     3  bin:x:2:2:bin:/bin:/usr/sbin/nologin
     4  sys:x:3:3:sys:/dev:/usr/sbin/nologin
#     5 sync:x:4:65534:sync:/bin:/bin/sync
#     6 games:x:5:60:games:/usr/games:/usr/sbin/
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/
     8  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/
     9  mail:x:8:8:mail:/var/mail:/usr/sbin/
    10  news:x:9:9:news:/var/spool/news:/usr/sbin/
    
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ sed '3s/bin/BIN/' test.txt
     1  root:x:0:0:root:/root:/bin/bash
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
     3  BIN:x:2:2:bin:/bin:/usr/sbin/nologin
     4  sys:x:3:3:sys:/dev:/usr/sbin/nologin
#     5 sync:x:4:65534:sync:/bin:/bin/sync
#     6 games:x:5:60:games:/usr/games:/usr/sbin/nologin
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
     8  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
     9  mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    10  news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
    
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ sed '3s/bin/BIN/g' test.txt
     1  root:x:0:0:root:/root:/bin/bash
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
     3  BIN:x:2:2:BIN:/BIN:/usr/sBIN/nologin
     4  sys:x:3:3:sys:/dev:/usr/sbin/nologin
#     5 sync:x:4:65534:sync:/bin:/bin/sync
#     6 games:x:5:60:games:/usr/games:/usr/sbin/nologin
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
     8  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
     9  mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    10  news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
    
    itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ sed '5,6s/^#//' test.txt
     1  root:x:0:0:root:/root:/bin/bash
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
     3  bin:x:2:2:bin:/bin:/usr/sbin/nologin
     4  sys:x:3:3:sys:/dev:/usr/sbin/nologin
     5  sync:x:4:65534:sync:/bin:/bin/sync
     6  games:x:5:60:games:/usr/games:/usr/sbin/nologin
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
     8  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
     9  mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    10  news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
    
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ sed '8,9s/^/  /' test.txt
     1  root:x:0:0:root:/root:/bin/bash
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
     3  bin:x:2:2:bin:/bin:/usr/sbin/nologin
     4  sys:x:3:3:sys:/dev:/usr/sbin/nologin
#     5 sync:x:4:65534:sync:/bin:/bin/sync
#     6 games:x:5:60:games:/usr/games:/usr/sbin/nologin
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
       8        lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
       9        mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    10  news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

 

ex)

i,a)

sed '5i\==========' test.txt -> 5번 라인에 '=========='를 입력

sed '5a\==========' test.txt -> 5번 라인 밑에 '=========='를 입력

 

r)

sed '3r file.txt' test.txt -> test.txt 파일 3번행 다음 행에 file.txt 내용을 불러오기

itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ echo "abcde......" -> file.txt
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ echo "abcde......" >> file.txt
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ cat file.txt
abcde...... -
abcde......

itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ sed '3r file.txt' test.txt
     1  root:x:0:0:root:/root:/bin/bash
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
     3  bin:x:2:2:bin:/bin:/usr/sbin/nologin
abcde...... -
abcde......
     4  sys:x:3:3:sys:/dev:/usr/sbin/nologin
#     5 sync:x:4:65534:sync:/bin:/bin/sync
#     6 games:x:5:60:games:/usr/games:/usr/sbin/nologin
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
     8  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
     9  mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    10  news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

 

ex)

e)

sed -e '/^#/d' -e 's/bin//' test.txt -> 
sed -e '/^#/d' -e 's'bin''g' test.txt ->

itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ sed '/^#/d' test.txt
     1  root:x:0:0:root:/root:/bin/bash
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
     3  bin:x:2:2:bin:/bin:/usr/sbin/nologin
     4  sys:x:3:3:sys:/dev:/usr/sbin/nologin
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
     8  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
     9  mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    10  news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
    
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ sed -e '/^#/d' -e 's/bin//' test.txt
     1  root:x:0:0:root:/root://bash
     2  daemon:x:1:1:daemon:/usr/s:/usr/sbin/nologin
     3  :x:2:2:bin:/bin:/usr/sbin/nologin
     4  sys:x:3:3:sys:/dev:/usr/s/nologin
     7  man:x:6:12:man:/var/cache/man:/usr/s/nologin
     8  lp:x:7:7:lp:/var/spool/lpd:/usr/s/nologin
     9  mail:x:8:8:mail:/var/mail:/usr/s/nologin
    10  news:x:9:9:news:/var/spool/news:/usr/s/nologin

 

# 실습하기

itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ mkdir data
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ cd data
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9/data$ cp /etc/services services1
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9/data$ cp /etc/services services2
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9/data$ cp /etc/services services3
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9/data$ cp /etc/services services4
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9/data$ cp /etc/services services5

itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9/data$ head -10 services1
# Network services, Internet style
#
# Updated from https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml .
#
# New ports will be added on request if they have been officially assigned
# by IANA and used in the real-world or are needed by a debian package.
# If you need a huge list of used numbers please install the nmap package.

tcpmux          1/tcp                           # TCP port service multiplexer
echo            7/tcp

 

vi 24_sed.sh

#!/binsh

# data 디렉토리 하위 모든 파일을 1~7행 삭제 후 저장

maindir=/home/itwill/linux_ex/ch9/data

flist=$(find $maindir -maxdepth 1 -type f)

for fname in $flist
do
  echo "$fname 파일을 수정하겠습니다."
  sed '1,7d $fname > $fname_imsi
  mv ${fname}_imsi $fname
done

03 awk - 자료처리

* 사용법

awk [옵션] '[/검색] {명령어}' 파일

 

 -01 산술연산

$ echo | awk '{print 1+2}'


 -02 grep

awk /itwill/ /etc/passwd

itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ echo | awk '{print 1 + 2}'
3
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ awk /itwill/ /etc/passwd
itwill:x:1000:1000:itwill:/home/itwill:/bin/bash
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ grep itwill /etc/passwd
itwill:x:1000:1000:itwill:/home/itwill:/bin/bash
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ echo abced | cut -c1,3
ac
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9$ echo abcde | cut -c1-3
abc

 -03 cut

echo "1:2:3" | awk -F: '{print $1}' -> :으로 필드를 구분하여 첫 번째 필드 출력

echo "1:2:3" | awk -F: '{print $NF}' -> 마지막 필드 출력

echo "1:2:3" | awk -F: '{print $(NF-1)}' -> 마지막 이전 필드 출력

echo "1:2:3" | awk -F: '{print $1"..."$2}' -> print로 위치변수와 일반문자열을 함께 출력할 수 있음 (""로 일반 문자열을 묶어 전달)

itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9/data$ echo "1:2:3" | awk -F: '{print $1}'
1

itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9/data$ echo "1:2:3" | awk -F: '{print $NF}'
3

itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9/data$ echo "1:2:3" | awk -F: '{print $(NF-1)}'
2

 

** 참고 : 외부 변수 값 전달

username=itwill

awk -F: '/$username/ {print $NF}' /etc/passwd -> 아무것도 출력되지 않는다. (홑따옴표 안의 $는 변수호출로 해석이 불가능)

awk -F: '/'$username'/ {print $NF}' /etc/passwd -> 정상출력

itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9/data$ awk -F: '/itwill/ {print $NF}' /etc/passwd
/bin/bash

itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9/data$ username=itwill
itwill@itwill-VMware-Virtual-Platform:~/linux_ex/ch9/data$ awk -F: '/$username/ {print $NF}' /etc/passwd