read, awk - 한 줄 읽어서 여러 변수에 할당하기

2023. 12. 30. 21:21리눅스 실제 사용 팁/bash

data.txt 는 식별번호, IP, 포트, 접속URL 로 구성되어 있다.

 

문제)

test 용 IP, 포트, 접속URL 을 read 1회 실행으로 구하는 코드를 작성하라.

IP, PORT, URL 변수에 할당해야 한다.

 

data.txt 의 내용 :

# 0 - dev
# 1 - test
# 2 - prod
0,127.0.0.1,8080,/main.do
1,test.myapp.com,7777,/index.do
2,www.myapp.com,8888,/login.do

 

해결과정)

1) AWK 를 써서 첫 번째 값이 '1' (test) 인 줄만 출력한다.

2) ',' 를 구분자로 해서 2, 3, 4번째 열을 출력한다.

grep -v '#' data.txt
---
(실행결과)
0,127.0.0.1,8080,/main.do
1,test.myapp.com,7777,/index.do
2,www.myapp.com,8888,/login.do


grep -v '#' data.txt | awk -F, '{print $2, $3, $4}'
---
(실행결과)
127.0.0.1 8080 /main.do
test.myapp.com 7777 /index.do
www.myapp.com 8888 /login.do


grep -v '#' data.txt | awk -F, '{ if ($1 == "1") {print $2, $3, $4} }'
---
(실행결과)
test.myapp.com 7777 /index.do

 

3) read 를 써서 각각의 변수에 한 번에 할당한다.

test.myapp.com 7777 /index.do

 

이 결과를 awk 를 세 번 써서 $1, $2, $3 을 각각 IP, PORT, URL 에 넣는 방법도 있다. 하지만, 변수가 늘어날 수록 awk 실행회수가 늘어나기 때문에 비효율적이다. data.txt 도 세 번 읽어야 한다. 이것을 read 로 한 방에 해결한다.

read IP PORT URL <<< $(grep -v '#' data.txt | awk -F, '{ if ($1 == "1") {print $2, $3, $4} }')

echo $URL
---
(실행결과)
/index.do

 

유의할 점 : read 는 스페이스(빈칸) 으로 입력값을 구분하기 때문에 데이터로 쓸 대상에는 스페이스가 포함시키지 않는 게 낫다.