리눅스 paste 명령어 사용법 - 파일을 옆으로 붙이고 여러 줄을 한 줄로 접기
이 명령어를 언제 쓰는가
cat 이 파일을 위아래로 이어 붙인다면 paste 는 좌우로 붙인다. 서버 목록과 그 서버들의 IP 목록이 따로 있을 때 한 줄에 나란히 놓거나, cut 으로 뽑아 둔 열들을 다시 조립할 때 쓴다.
덜 알려졌지만 더 자주 쓰게 되는 쪽은 -s 다. 여러 줄을 한 줄로 접어 콤마 목록으로 만들거나, 3줄씩 반복되는 출력을 표로 펴는 데 쓴다. 이 두 가지만 알아도 paste 값은 다 뽑는다.
기본 형식
paste [-s] [-d 구분자목록] 파일1 파일2 ...
- 기본 동작은 각 파일의 n번째 줄을 탭으로 이어 한 줄로 만드는 것이다.
- 파일 이름 자리에
-를 쓰면 표준 입력을 읽는다.-를 여러 번 쓸 수 있고, 이것이 paste 의 핵심 트릭이다. -s를 주면 방향이 바뀐다. 파일마다 모든 줄을 한 줄로 접는다.
자주 쓰는 옵션
| 옵션 | 의미 | 예시 |
|---|---|---|
-d LIST | 구분자를 지정한다. 여러 글자를 주면 순서대로 돌아가며 쓴다 | paste -d, a.txt b.txt |
-s | 파일의 모든 줄을 한 줄로 접는다(serial) | paste -s -d, list.txt |
- | 표준 입력. 개수만큼 열이 생긴다 | seq 6 | paste - - - |
-d '\n' | 구분자를 개행으로. 구분자 목록에 \0 을 쓰면 구분자 없음 | paste -d'\0' a.txt b.txt |
실전 예제
1) 서버 이름 파일과 IP 파일을 한 줄로 합친다. 두 파일의 줄 순서가 같다는 전제에서 가장 빠른 방법이다.
paste -d' ' hosts.txt ips.txt > hostmap.txt
2) 목록을 콤마로 이어 한 줄로 만든다. 설정 파일이나 SQL IN 절에 넣을 문자열을 만들 때 쓴다.
sort -u ip.txt | paste -s -d, -
10.0.0.11,10.0.0.12,10.0.0.13
tr '\n' ',' 와 달리 마지막에 구분자가 붙지 않는다. sed 로 뒤처리할 필요가 없다는 뜻이다.
3) 3줄씩 반복되는 출력을 표로 편다. 한 줄에 하나씩 값이 찍히는 도구의 출력을 정리할 때 유용하다.
seq 1 6 | paste -d' ' - - -
1 2 3
4 5 6
4) cut 으로 뽑은 두 열의 순서를 바꿔 다시 붙인다. cut 자체는 열 순서를 못 바꾸지만 paste 와 프로세스 치환을 쓰면 된다.
paste -d: <(cut -d: -f7 /etc/passwd) <(cut -d: -f1 /etc/passwd) | head -n 5
bash·zsh 의 <(...) 문법이 필요하므로 sh(dash)로 실행되는 스크립트에서는 동작하지 않는다.
5) 파일 세 개를 서로 다른 구분자로 조립한다. 구분자 목록은 이음매마다 순서대로 돌아가며 쓰인다.
paste -d':|' user.txt uid.txt shell.txt
deploy:1001|/bin/bash
backup:1002|/usr/sbin/nologin
6) 여러 서버에서 받아 온 결과를 호스트 이름과 나란히 붙인다. 반복문 출력은 값만 나오므로 어느 서버 것인지 알 수 없는데, paste 로 이름을 되붙인다.
for h in $(cat hosts.txt); do ssh "$h" 'uptime -p'; done | paste -d' ' hosts.txt -
함정과 주의점
줄 수가 다르면 조용히 빈칸으로 채운다. paste 는 경고하지 않는다. 3줄짜리와 1줄짜리를 붙이면 나머지 두 줄은 구분자만 남는다.
$ paste names.txt one.txt
a z
b
c
두 파일이 같은 순서·같은 개수라는 보장이 없으면 paste 가 아니라 join 을 써야 한다. paste 는 위치로 붙이고 join 은 키로 붙인다. 데이터가 어긋난 채 붙어 버리는 사고는 대부분 이 선택을 잘못해서 난다.
기본 구분자는 탭이다. 결과를 눈으로 보면 예뻐 보이지만 이후 cut -d' ' 로 처리하려 하면 안 먹는다. 탭 구분이면 cut -f(구분자 지정 없이)를 쓰거나 처음부터 -d 로 원하는 구분자를 지정한다.
-s 는 파일별로 접는다. 파일 두 개를 -s 로 넘기면 한 줄이 아니라 두 줄이 나온다. 여러 파일을 통째로 한 줄로 만들려면 cat a b | paste -s -d, - 처럼 먼저 합쳐야 한다.
함께 보면 좋은 명령어
join— 줄 순서가 아니라 공통 키로 두 파일을 합쳐야 할 때 쓴다.cut— 열을 뽑는 반대 방향 작업. paste 와 짝으로 쓰인다.column— 붙인 결과를 사람이 읽기 좋게 정렬해 보여 준다(column -t).