[리눅스] 파이프

Becoming a Data Engineer ·2023년 9월 18일
0

리눅스

목록 보기
8/9
post-thumbnail

1. 파이프, Pipe (|)

역할

표준 출력을 받아서 다음 명령어의 표준 입력으로 전달해주는 역할

파이프는 | 문자를 사용하여 파이프라인을 만드는 것으로 하나의 명령어 출력을 저장해서 다른 명령어로 전달할 수 있다.

사용법

[COMMAND 1] 의 표준 출력을 [COMMAND 2] 의 표준 입력으로 전달

[COMMAND 1] | [COMMAND 2]

ls | head

  • ls : list directory contents
    • -1 : 모든 결과를 한줄에 하나씩 표현
    • -a : do not ignore entries starting with .
  • head : Print the first 10 lines of each FILE to standard output.
    • -n : print the first NUM lines instead of the first 10
╭─ ~
╰─ ls -1a /usr/bin | head -n 5 	
.
..
GET
HEAD
NF

ls | wc

  • wc : Print newline, word, and byte counts
    • -l : print the newline counts
╭─ ~
╰─ ls -1a /usr/bin | wc -l
878

2. 리다이렉션과 파이프

리다이렉션과 파이프 모두 표준 스트림을 이용하고 상호작용하는 점은 동일하다.

리다이렉션은 표준 출력을 특정 파일로 출력하는 반면, 파이프는 두 명령어를 연결해서 앞의 명령어의 출력을 뒤 명령어의 입력으로 전달하고 이 과정에서 파일이 필요없다.

>를 이용해 표준 출력을 파일로 출력하는 리다이렉션과는 다르게 파이프는 파일이 개입하지 않는다.

파이프와 리다이렉션을 섞어서 함께 사용하는 것도 가능하다.

리다이렉션과 파이프의 차이

  • 파이프 : date | rev
  • 리다이렉션 : date > rev
╭─ ~/test
╰─ date 
Mon Sep 18 16:19:43 KST 2023

╭─ ~/test 
╰─ date > rev  

╭─ ~/test
╰─ date | rev
3202 TSK 25:91:61 81 peS noM

╭─ ~/test 
╰─ ls -l
total 28
-rw-r--r-- 1 hyojin hyojin   29 Sep 18 16:19 rev
...(생략)...

╭─ ~/test 
╰─ cat rev
Mon Sep 18 16:19:48 KST 2023

리다이렉션과 파이프 같이 사용하기

  • ls /usr/bin -1 | wc -l > programs_count.txt
    • 파이프 : ls /usr/bin -1 | wc -l
    • 리다이렉션 : > programs_count.txt
╭─ ~/test 
╰─ ls -l 
(빈 폴더)

╭─ ~/test 
╰─ ls /usr/bin -1 | wc -l > programs_count.txt

╭─ ~/test 
╰─ ls -l 
(programs_count.txt 파일이 새롭게 생긴 것을 볼 수 있음)
-rw-r--r-- 1 hyojin hyojin    4 Sep 19 18:00 programs_count.txt

╭─ ~/test
╰─ cat programs_count.txt
876

3. 예제

cat | tr | tr | tr > ouput.txt

  • cat : Concatenate FILE(s) to standard output. With no FILE, or when FILE is -, read standard input.
  • tr : Translate, squeeze, and/or delete characters from standard input, writing to standard output.
    • -d : delete characters in SET1, do not translate
      • 문자 클래스
        • 모든 문자를 지우기 → '[:alpha:]' 또는 [:alpha:]
        • 공백문자와 tab 지우기 → '[:blank:]' 또는 [:blank:]
      • : 를 지우기 → tr -d :

step 1 : 파이프

╭─ ~/test 
╰─ cat novel.txt
she sellls seashells by the seashore.

╭─ ~/test 
╰─ cat novel.txt | tr s S 	(--> 모든 s를 S로 변경)
She SelllS SeaShellS by the SeaShore.

╭─ ~/test 
╰─ cat novel.txt | tr a-z A-Z		(--> a-z로 모든 소문자를 A-Z의 모든 대문자로 변경)
SHE SELLLS SEASHELLS BY THE SEASHORE.

╭─ ~/test 
╰─ cat novel.txt
she sellls seashells by the seashore.

step 2 : 파이프

╭─ ~/test 
╰─ cat novel.txt
she sellls seashells by the seashore.

╭─ ~/test 
╰─ cat novel.txt | tr -d s 	(--> 모든 s가 지워짐)
he elll eahell by the eahore.

╭─ ~/test 
╰─ cat novel.txt
she sellls seashells by the seashore.

step 3 : 여러 개의 파이프로 구성된 표준입력을 리다이렉션

번호만 있는 새로운 파일 생성

╭─ ~/test 
╰─ cat data.txt 
Todd: 951 873 1234
Margaret: 415 565 6999
Juan: 212 720 3911
Lando: 961 112 3424

╭─ ~/test
╰─ cat data.txt | tr -d '[:alpha:]'
: 951 873 1234
: 415 565 6999
: 212 720 3911
: 961 112 3424

╭─ ~/test 
╰─ cat data.txt | tr -d '[:blank:]'
Todd:9518731234
Margaret:4155656999
Juan:2127203911
Lando:9611123424

╭─ ~/test 
╰─ cat data.txt | tr -d : 
Todd 951 873 1234
Margaret 415 565 6999
Juan 212 720 3911
Lando 961 112 3424

╭─ ~/test 
╰─ cat data.txt | tr -d '[:alpha:]' | tr -d '[:blank:]' | tr -d : > phones.txt 

╭─ ~/test 
╰─ cat phones.txt 
9518731234
4155656999
2127203911
9611123424

╭─ ~/test 
╰─ cat data.txt 
Todd: 951 873 1234
Margaret: 415 565 6999
Juan: 212 720 3911
Lando: 961 112 3424

tac | rev

  • tac

    • Concatenate and print files in reverse.
    • Write each FILE to standard output, last line first.
  • rev

    • Reverse lines characterwise
    • Copies the specified files to standard output, reversing the order of characters in every line. If no files are specified, standard input is read.
╭─ ~/test 
╰─ cat words.txt 
desserts
live
knits
regal
knits
pupils

╭─ ~/test 
╰─ rev words.txt 
stressed
evil
stink
lager
stink
slipup

╭─ ~/test 
╰─ tac words.txt 
pupils
knits
regal
knits
live
desserts

╭─ ~/test 
╰─ tac words.txt | rev
slipup
stink
lager
stink
evil
stressed

╭─ ~/test 
╰─ cat words.txt 
desserts
live
knits
regal
knits
pupils

cat | head | tail

  • cat
    • -n, --numbers : 줄 번호가 생긴다.
╭─ ~/test 
╰─ head -7 programs.txt 
GET
HEAD
NF
POST
X11
[
aa-enabled

╭─ ~/test
╰─ cat -n programs.txt 
     1  GET
     2  HEAD
     3  NF
     4  POST
     5  X11
     6  [
     7  aa-enabled
     8  aa-exec
   (...생략...)
   874  znew
   875  zsh
   876  zsh5

╭─ ~/test 
╰─ cat -n programs.txt | head -7 | tail -3  
     5  X11
     6  [
     7  aa-enabled

ls | sort | head > output.txt

  • ls -lh : 파일 크기를 메가바이트나 킬로바이트나 기가바이트로 표기하여 파일 목록 보여줌
  • sort : sort lines of text files
    • -r : reverse the result of comparisons
    • -h : 숫자와 사람이 읽기 쉬운 형식을 모두 고려하여 정렬
      • 숫자를 사람이 읽기 쉬운 형식으로 정렬
      • 주로 파일 크기, 디스크 사용량 등과 같이 용량을 나타내는 데이터를 다룰 때 유용
        • 숫자 뒤에 나오는 문자열을 해석하여 크기에 따라 정렬한다.
        • 예를 들어, 1K, 1M, 2G와 같은 데이터는 숫자 크기에 따라 정렬됩니다.
      • -n 옵션과의 차이점 : -n 옵션은 순전히 숫자 크기에 따라 정렬하고 문자열은 정렬에서 제외됨
    • -k[정렬하고자 하는 열 번호] : 데이터의 특정한 열을 문자로 인식하여 정렬

[ /usr/bin 에서 목록에서 크기가 가장 큰 파일 찾기 ]

╭─ ~/test 
╰─ ls -lh /usr/bin 	
total 102M
lrwxrwxrwx 1 root root      11 Jan 29  2022  GET -> lwp-request
lrwxrwxrwx 1 root root      11 Jan 29  2022  HEAD -> lwp-request
lrwxrwxrwx 1 root root       4 Feb 17  2020  NF -> col1
lrwxrwxrwx 1 root root      11 Jan 29  2022  POST -> lwp-request
lrwxrwxrwx 1 root root       1 Mar 25  2022  X11 -> .
-rwxr-xr-x 1 root root     51K Feb  8  2022 '['
-rwxr-xr-x 1 root root     35K Oct 19  2022  aa-enabled
-rwxr-xr-x 1 root root     35K Oct 19  2022  aa-exec
(...생략...)
-rwxr-xr-x 1 root root    990K Feb 13  2022  zsh
-rwxr-xr-x 1 root root     852 Feb 13  2022  zsh5

╭─ ~/test 
╰─ ls -lh /usr/bin | sort -k5hr | head -n 5                                   
-rwxr-xr-x 1 root root     16M May 29 21:08 snap
-rwxr-xr-x 1 root root    5.7M Jun 11 14:26 python3.10
-rwxr-xr-x 1 root root    3.7M Aug 18 13:12 vim.basic
-rwxr-xr-x 2 root root    3.7M May 24 02:18 perl
-rwxr-xr-x 2 root root    3.7M May 24 02:18 perl5.34.0

╭─ ~/test 
╰─ ls -lh /usr/bin | sort -k5hr | tail -n 5                                   
lrwxrwxrwx 1 root root       3 May 17 03:45 infotocap -> tic
lrwxrwxrwx 1 root root       2 Apr  8  2022 unxz -> xz
lrwxrwxrwx 1 root root       2 Apr  8  2022 xzcat -> xz
lrwxrwxrwx 1 root root       1 Mar 25  2022 X11 -> .
total 102M

╭─ ~/test 
╰─ ls -lh /usr/bin | sort -k5hr | head -n 5 > top5_big_file.txt               

╭─ ~/test 
╰─ cat top5_big_file.txt                                                       
-rwxr-xr-x 1 root root     16M May 29 21:08 snap
-rwxr-xr-x 1 root root    5.7M Jun 11 14:26 python3.10
-rwxr-xr-x 1 root root    3.7M Aug 18 13:12 vim.basic
-rwxr-xr-x 2 root root    3.7M May 24 02:18 perl
-rwxr-xr-x 2 root root    3.7M May 24 02:18 perl5.34.0

가장 큰 파일을 찾고 싶을 때는 du 명령어를 사용하는 것이 더 적합하다.

  • du : estimate file space usage
    • -a : 숨김 파일까지 포함한 전체 목록
    • -h : 읽기 쉬운 사이즈로 표현
╭─ ~/test 
╰─ du -ah /usr/bin | sort -h | tail -10                                       
1.9M    /usr/bin/x86_64-linux-gnu-dwp
2.1M    /usr/bin/busybox
3.1M    /usr/bin/x86_64-linux-gnu-ld.gold
3.2M    /usr/bin/tilix
3.6M    /usr/bin/git
3.7M    /usr/bin/perl
3.7M    /usr/bin/vim.basic
5.7M    /usr/bin/python3.10
16M     /usr/bin/snap
99M     /usr/bin

╭─ ~/test 
╰─ du -ah /usr/bin | sort -h | tail -10 | head -9                             
1.9M    /usr/bin/x86_64-linux-gnu-dwp
2.1M    /usr/bin/busybox
3.1M    /usr/bin/x86_64-linux-gnu-ld.gold
3.2M    /usr/bin/tilix
3.6M    /usr/bin/git
3.7M    /usr/bin/perl
3.7M    /usr/bin/vim.basic
5.7M    /usr/bin/python3.10
16M     /usr/bin/snap

4. tee 명령어

[COMMAND 1] | tee file.txt | [COMMAND 2]

  • tee : read from standard input and write to standard output and files

두 파이프 사이에 tee를 두면 첫번째 명령어의 결과를 받아서 특정한 파일(file.txt)에 저장하고 다음 명령어로 넘겨준다.

즉, 이 명령어를 사용하면 파이프라인 중간에 있는 내용을 한 명령줄 안에서 출력도 함께 할 수 있다.

╭─ ~/test 
╰─ du -ha /usr/bin | sort -h | tail -4 | head -3                               
3.7M    /usr/bin/vim.basic
5.7M    /usr/bin/python3.10
16M     /usr/bin/snap

╭─ ~/test 
╰─ du -ha /usr/bin | sort -h | tail -4 | head -3 > size_list2.txt             

╭─ ~/test 
╰─ cat size_list2.txt                                                         
3.7M    /usr/bin/vim.basic
5.7M    /usr/bin/python3.10
16M     /usr/bin/snap

아래 명령어를 사용하면 파이프를 통해 전체 파일이 정렬된 du | sort의 출력이 tee에 표준입력으로 전달되고 tee는 이 결과를 size_list.txt로 저장하고 동시에 tail로 전달한다.

╭─ ~/test 
╰─ du -ha /usr/bin | sort -h | tee size_list.txt | tail -4 | head -3           
3.7M    /usr/bin/vim.basic
5.7M    /usr/bin/python3.10
16M     /usr/bin/snap

정렬된 것들을 tailhead로 줄이기 전의 값이 size_list.txt 파일에 저장되어 있다.

╭─ ~/test 
╰─ cat size_list.txt                                                           
0       /usr/bin/GET
0       /usr/bin/HEAD
0       /usr/bin/NF
(...생략...)
3.2M    /usr/bin/tilix
3.6M    /usr/bin/git
3.7M    /usr/bin/perl
3.7M    /usr/bin/vim.basic
5.7M    /usr/bin/python3.10
16M     /usr/bin/snap
99M     /usr/bin
profile
I want to improve more 👩🏻‍💻

0개의 댓글