1. Linux utility 사용하기
1-1. awk 프로그래밍
awk란?
- record-oriented language : 레코드(줄) 지향 언어다. 입력을 줄 단위로 읽어 처리하는 것이 기본 동작이다.
- Aho, Weinberger, Kernighan : 만든 세 사람의 이름 첫 글자를 딴 것이다. AT&T 벨 연구소에서 나왔다. 앞서 언급한 그 유래다.
Record와 Field
awk가 입력을 나누는 두 단위다.
| Record | 개행(new line) — 한 줄 |
| Field | 공백, 탭 — 줄 안의 각 항목 |
기본적으로 한 줄이 하나의 record이고, 그 줄을 공백/탭으로 나눈 것이 field다. field는 $1, $2... 로 참조한다.
awk 실행 방식 두 가지
1) Format — 명령줄에 직접
awk 'statement' input_file
작은따옴표 안에 awk 구문을 직접 써서 실행한다. 짧은 작업에 쓰는 가장 흔한 방식이다. 지금까지 실습한 것들이 다 이 형태였다.
2) scripts — 파일로 저장해 실행
awk -f script_name input_file
awk 구문이 길거나 반복 사용할 때는 파일에 저장하고 -f로 불러온다. 앞서 sed에서 -f가 스크립트 지정이었던 것과 같은 개념이다.
구분자 변경 가능
- : 나 , 를 delimiter로 설정 가능 : 기본 구분자(공백/탭) 대신 다른 문자를 필드 구분자로 지정할 수 있다.
$ awk -F: '{print $1}' /etc/passwd # : 로 구분
$ awk -F, '{print $2}' data.csv # , 로 구분 (CSV)
-F로 구분자를 바꾼다. /etc/passwd는 :, CSV 파일은 ,로 나뉘므로 이 기능이 필수다.
statement의 세 가지 형태
| pattern { action } | 패턴에 맞는 줄에 action 실행 |
| pattern (action 생략) | 패턴에 맞는 줄을 print (기본 동작) |
| { action } (pattern 생략) | 모든 줄(all record)에 action 실행 |
# pattern + action : north 줄의 첫 필드만
$ awk '/north/{print $1}' data.file
northwest
northeast
north
# pattern만 : north 줄 전체 (print 기본)
$ awk '/north/' data.file
northwest NW Joel Craig ...
northeast NE TJ Nichols ...
north NO Val Shultz ...
# action만 : 모든 줄의 첫 필드 (all record 기본)
$ awk '{print $1}' data.file
northwest
western
southwest
...


awk의 내장 변수(Built-in 변수)
주요 Built-in 변수
| FS | space or tab | input field separator (입력 필드 구분자) |
| OFS | space | output field separator (출력 필드 구분자) |
| NR | update-each line | record number (현재 줄 번호) |
1) FS — 입력 필드 구분자
입력을 필드로 나눌 때 기준이 되는 문자다. 기본은 공백/탭이다. 이걸 바꾸면 :나 , 같은 다른 문자로 나눌 수 있다. 앞서 배운 -F가 바로 이 FS를 설정하는 옵션이다.
| -F: | 명령줄 옵션 |
| BEGIN { FS=":" } | BEGIN 블록에서 설정 |
BEGIN { } ← 시작 전 한 번
{ } ← 각 줄마다 반복
END { } ← 끝난 후 한 번
F 옵션
awk -F: 'statement' file
명령줄에서 -F 뒤에 구분자를 붙인다. 간단해서 자주 쓴다.

BEGIN에서 FS 설정
awk 'BEGIN { FS=":" } ; statement' file

2) OFS — 출력 필드 구분자
print로 출력할 때 필드 사이에 넣는 문자다. 기본은 공백이다. 쉼표로 필드를 나눠 출력하면 그 자리에 OFS가 들어간다.
$ awk '{print $1, $2}' # 쉼표 자리에 OFS(공백)가 들어감
3) NR — 레코드 번호
지금까지 읽은 줄 번호다. 줄마다 1씩 증가한다. 앞서 잠깐 본 그 변수다.
실습 과정






| NF | 필드 개수 (숫자) | 8 (모든 줄) |
| $NF | 마지막 필드의 값 | 4, 23, 18... |

| %2f | 실수를 출력 (계산 결과가 들어갈 자리) |
| %% | 퍼센트 기호 자체 (% 하나를 찍으려면 %%로) |
| \t | 탭 |
| \n | 줄바꿈 |

NF-2는 마지막 필드 번호에서 2를 뺀 값이다. 그 위치의 필드를 $(...)로 꺼낸다.

\/$는 슬래시로 끝나는 줄
2. 반복문 사용하기
2-1. for문 사용하기
for문 기본 구조
for var in argument_list
do
statement1
statement2
done
- var : 반복할 때마다 값이 바뀌는 변수
- argument_list : 반복 대상 목록
- do ... done : 반복할 명령 블록
argument_list의 일곱 가지 형태
for가 반복할 목록을 만드는 방법이 여러 가지다.
1) Explicit list — 직접 나열
for fruit in apple orange banana
값을 공백으로 구분해 직접 쓴다. 위 예제가 이것이다.
2) 변수 대체
for x in $INPUT
변수에 담긴 값을 목록으로 쓴다. 변수 안의 공백으로 구분된 단어들이 각각 하나의 항목이 된다.
3) 명령 라인 Arguments
for arg in $*
스크립트에 넘어온 인자 전체를 반복한다. 앞서 배운 $*나 $@를 목록으로 쓴다.
for arg in "$@"; do echo $arg; done
4) 명령 대체
for user in $(cat userlist)
for f in `ls`
명령의 실행 결과를 목록으로 쓴다. $(cmd)나 백틱으로 명령을 실행해 그 출력을 반복 대상으로 삼는다. 앞서 배운 명령 치환이다.
5) file name 제공
for f in $(ls /etc/p*)
명령으로 파일 목록을 만들어 반복한다. ls 결과가 목록이 된다.
6) file name metacharacter
for f in /etc/p*
와일드카드를 직접 쓴다. 셸이 /etc/p*를 p로 시작하는 파일 목록으로 확장해 반복한다. 명령 없이 셸의 글롭 기능만으로 파일을 순회한다.
for f in *.txt
do
echo "파일: $f"
done
7) 순차 처리
for i in {1..6}
앞서 배운 중괄호 확장이다. {1..6}이 1 2 3 4 5 6으로 펼쳐져 숫자를 순서대로 반복한다.
for i in {1..5}
do
echo "$i 번째"
done
형태별 정리
| Explicit list | apple orange | 직접 나열 |
| 변수 대체 | $INPUT | 변수 값 |
| 명령행 인자 | $* | 스크립트 인자 |
| 명령 대체 | $(cmd) | 명령 출력 |
| file name 제공 | $(ls /etc/p*) | ls 결과 |
| glob 문자 | /etc/p* | 셸 확장 |
| 순차 처리 | {1..6} | 중괄호 확장 |
실습 과정
#!/bin/sh
echo -n "Enter some text: "
read INPUT
for var in $INPUT
do
echo "var contains: $var"
done

/bin/sh
IFS=":"
for var in `cat fruit4`
do
echo "var contains: $var"
done

2-2. While문 사용하기
while문 기본 구조
while command_control
do
statement1
statement2
done
- command_control : 반복을 계속할지 판단하는 조건
- do ... done : 조건이 참인 동안 반복할 블록
조건이 참(종료값 0)이면 do 이하를 실행하고, 다시 조건을 검사한다. 조건이 거짓이 되면 반복을 멈춘다. if처럼 while도 명령의 종료값으로 참,거짓을 판단한다.
while문에서 중요한 것은 반복 안에서 조건에 영향을 주는 값을 바꿔야 한다는 것이다. 여기서는 (( num = num + 1 ))로 num을 늘린다. 이게 없으면 num이 계속 5에 머물러 조건이 영원히 참이 되고, 무한 반복에 빠진다.
break와 continue
무한 loop나 일반 반복에서 흐름을 제어하는 두 명령이다.
- break : 반복을 완전히 빠져나온다
- continue : 이번 회차를 건너뛰고 다음 반복으로 간다
중간 미션
passwd에서 사용자 이름이랑 uid 뽑아내기
#!/bin/bash
while IFS=":" read username _ uid _
do
echo "이름: $username, UID: $uid"
done < /etc/passwd
~

3. etc
3-1. here document
here document는 스크립트 안에서 대화형 프로그램에 미리 정해둔 입력을 자동으로 넣어주는 기능
기본 문법
command << 단어
입력 내용
입력 내용
단어
- << 단어 : 여기서부터 입력이 시작된다는 표시. 단어는 보통 EOF를 쓴다
- 그 아래 줄들이 command의 입력으로 들어간다
- 시작할 때 쓴 단어(EOF)를 다시 만나면 입력 끝
<< 다음의 단어부터 같은 단어가 다시 나올 때까지가 입력 덩어리다.

3-2. 함수 사용하기
명령을 재사용하는 방법
-
- alias — 명령에 짧은 별칭 붙이기
- function — 명령 묶음을 함수로 만들기
- script — 파일로 저장해 실행하기
함수 선언 두 가지 방법
1) function_name ()
function_name ()
{
명령들
}
함수 이름 뒤에 ()를 붙이는 방식이다. 슬라이드에 bourne shell only라고 적혀 있는데, 이 괄호 방식이 어느 셸에서나 통용되는 표준 형태다.
2) function name
function name
{
명령들
}
function 키워드를 앞에 붙이는 방식이다. 이땐 ()를 생략할 수 있다. bash나 ksh에서 쓴다. 두 방식 모두 결과는 같다. 어느 쪽이든 명령 묶음을 이름에 연결한다.


함수 보기
typeset -f # 모든 함수의 내용
declare -f # 위와 같음 (bash)
typeset -f 함수명 # 특정 함수만
#!/bin/sh
function hello
{
echo '$1 in the function is: ' $1
}
echo 'Input passed and stored in $1 is: ' $1
hello John
echo
echo 'After the function $1 is still ' $1
이때 각 $1은 구분된다.
function hello
{
echo "... $1 ..." ← 함수의 $1 (함수에 넘긴 인자)
}
echo '... $1 ...' $1 ← 스크립트의 $1 (스크립트에 넘긴 인자)
hello John ← 함수에 John을 넘김
echo '... $1 ...' $1 ← 스크립트의 $1

'{Bootcamp} > KT Cloud Tech up 클라우드 인프라' 카테고리의 다른 글
| [KT Cloud] 리눅스 관리자 실습 (1) (0) | 2026.08.28 |
|---|---|
| [KT Cloud] 쉘 프로그래밍 (1) (0) | 2026.08.27 |
| [KT Cloud] 리눅스 기본 및 실습 정리 (4) (0) | 2026.08.26 |
| [KT Cloud] 리눅스 기본 및 실습 정리 (3) (0) | 2026.08.25 |
| [KT Cloud] 리눅스 기본 및 실습 정리 (2) (0) | 2026.08.24 |