Devin.KR
로그인

리눅스 paste 명령어 사용법 - 파일을 옆으로 붙이고 여러 줄을 한 줄로 접기

개발자 조회 1

이 명령어를 언제 쓰는가

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).