nayoungs
항상 끈기있게
nayoungs
  • 분류 전체보기 (274)
    • Cloud (21)
      • AWS (15)
      • Azure (3)
      • NCP (2)
      • GCP (1)
    • DevOps (68)
      • Docker (16)
      • Kubernetes (50)
      • CICD (2)
    • IaC (25)
      • Ansible (17)
      • Terraform (8)
    • Certification (4)
    • 금융 IT (5)
    • AI (3)
    • Linux (47)
    • 미들웨어 (5)
    • Programming (7)
      • GoLang (3)
      • Spring (4)
    • CS (25)
      • 네트워크 (17)
      • 운영체제 (5)
      • Web (1)
      • 개발 상식 (2)
      • 데이터베이스 (0)
    • Algorithm (59)
      • 프로그래머스 (36)
      • 백준 (18)
      • 알고리즘 정리 (5)
    • ETC (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
nayoungs

항상 끈기있게

Linux

[Linux] 파일 입출력 관련 명령어

2022. 2. 18. 23:18
728x90

📌INDEX

  • cut
  • paste
  • diff
  • grep
  • sort
  • sed
  • awk



✔️ cut

  • 리눅스에서 파일 내용을 각 필드로 구분하고, 필드별로 내용을 추출하며, 각 필드들을 구분자로 구분할 수 있는 명령어
  • 사용법: cut [옵션] [파일명]
  • 옵션
    • -c : 잘라낼 곳의 글자 위치를 지정
      • 콤마나 하이픈을 사용하여 범위를 정할 수 있고, 혼합하여 사용 가능
    • -s : 필드 구분자를 사용.
      • 필드 구분자를 포함할 수 없다면 그 행은 하지 않는다.
    • -d : 지정한 문자를 구분자로 사용
      • default 구분자는 공백 ' '
    • -f : 지정한 필드를 출력한다.

예시

  • 아래의 sample을 이용하여 cat을 활용해보자
[root@localhost ~]# cat sample
sung 23 010-1234-5678
park 28 011-8765-4321
yoon 46 010-4321-5678
kin 33 016-1122-3344
la 15 010-5555-5555
  • 공백을 기준으로 필드 1,3을 출력하라
  • 3과 1을 바꾸어도 출력되는 순서는 동일하다
[root@localhost ~]# cut -d ' ' -f 1,3 sample
sung 010-1234-5678
park 011-8765-4321
yoon 010-4321-5678
kin 016-1122-3344
la 010-5555-5555
  • 이번에는 /etc/passwd 파일에서 첫번째 필드와, 세번째부터 여섯번째 필드를 : 구분자를 기준으로 나누어 마지막 5줄만 출력하라
[root@localhost ~]# cut -d ':' -f 1,3-6 /etc/passwd | tail -5
sshd:74:74:Privilege-separated SSH:/var/empty/sshd
rngd:975:974:Random Number Generator Daemon:/var/lib/rngd
tcpdump:72:72::/
user:1000:1000:user:/home/user
test1:1001:1001::/home/test1



✔️ paste

  • 하나 이상의 파일에서 행을 합치는 명령어(파일의 내용을 결헙)
  • 사용법: paste [옵션] [파일이름] [파일이름]
  • 옵션
    • -s : 한 파일의 내용을 한 줄로 보여준 후 다른 파일의 내용을 한 줄로 덧붙인다.
      • 수평으로 붙인다.
    • -d : 출력되는 내용의 구분자를 지정한다.

예시

  • 위와 같은 2개의 파일 sample1, sample2를 paste 해보자
[root@localhost ~]# paste sample1 sample2
seoul   namhae
ilsan   seoul
busan
    • 새로운 필드로 각각 붙여서 새로운 data field로 만들어진 것을 확인할 수 있다.
    • 그러나 paste한 파일은 글자수가 다를 때 간격이 일정하지 않아 cut 하기 힘들다.
  • ' : '구분자를 이용하여 sample1, sample2를 paste해보자
[root@localhost ~]# paste -d : sample1 sample2
seoul:namhae
ilsan:seoul
busan:
  • ' | ' 구분자를 이용하여 sample1, sample2를 수평으로 (한 행에 한 파일의 내용) paste해보자
[root@localhost ~]# paste -d '|' -s sample1 sample2
seoul|ilsan|busan
namhae|seoul

 

[root@localhost ~]# cat sample1
seoul
ilsan
busan
[root@localhost ~]# cat sample2
namhae
seoul

 



✔️ diff

  • differences의 약자로, 두 파일 사이의 내용을 비교하는 명령어이다.
  • 사용법: diff [옵션] [파일명] [파일명]
  • 옵션
    • -b : space를 무시하고 비교
    • -i : 대소문자를 구분하지 않는다
    • -d : 세세한 차이까지 검색
    • -s : 두 파일이 같은지 확인
    • -u : undirectional new fiel 옵션으로 비교하는 파일/디렉토리가 빠져있을 경우, dummy로 처리해서 출력을 통일시킴

예시

  • sample1은 앞선 paste예시에 나와있음
  • sample3
[root@localhost ~]# cat sample3
seoul
ilsan
  • sample1과 sample3의 내용이 다른지 확인해보자.
[root@localhost ~]# diff sample1 sample3
3d2
< busan
\ No newline at end of file
  • ' > ' 는 뒤에 입력한 파일(sample3)을 의미하고, ' < ' 앞에 입력한 파일(sample1)을 의미한다.
  • -u 옵션을 추가해보자
[root@localhost ~]# diff -u sample1 sample3
--- sample1     2022-02-18 06:36:47.423422200 -0500
+++ sample3     2022-02-18 06:57:03.567559438 -0500
@@ -1,3 +1,2 @@
 seoul
 ilsan
-busan
\ No newline at end of file
  • sample1이 sample3가 되기 위해서는 busan을 빠져야된다고 알려줌



✔️ grep

  • 파일에서 원하는 문자열이 들어간 행을 찾아 출력하는 명령어
  • 주로 log파일에서 특정 날짜, 문자로 기록된 error 메시지를 찾는데 유용하게 사용
  • 사용법 : grep [옵션] [패턴] [파일명]
  • 옵션
    • -v : 패턴을 포함하지 않은 행을 출력
    • -i : 대소문자를 구분하지 않는다.
    • -n : 줄 번호를 함께 출력
    • -l : 파일명을 출력
    • -c : 일치하는 라인의 개수를 출력
  • grep에서 자주 사용하는 형식
    • grep ^[문자열] : 문자열로 행이 시작되는 경우 출력
    • grep [문자열]$ : 문자열로 행이 끝나는 경우 출력
    • grep -v [문자열] : 해당 문자열을 제외한 행 출력
    • grep [문자열] * : 현재 위치의 모든 파일 (*) 에서 특정 문자열 출력
    • grep ^[0-9] : 숫자로 시작되는 경우 출력
    • grep ^[a-z]: 소문자 영문자로 시작되는 경우 출력
    • grep ^[A-Z] : 대문자 영문자로 시작되는 경우 출력

예시

  • /etc/passwd 에서 root 문자열이 들어간 파일을 출력해보자.
[root@localhost ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
  • /etc/passwwd에서 root 문자열이 들어간 파일을 제외하고 5번째 줄 까지 출력해보자.
[root@localhost ~]# grep -v root /etc/passwd | head -5
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
  • /etc/passwd 에서 root로 시작하는 행을 출력해보자.
[root@localhost ~]# grep ^root /etc/passwd
root:x:0:0:root:/root:/bin/bash
  • /etc/passwd 에서 nologin으로 끝나는 행을 5개만 출력해보자.
[root@localhost ~]# grep nologin$ /etc/passwd | head -5
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  • /etc/passwd 에서 root 가 들어간 행을 라인넘버를 붙여 출력해보자.
[root@localhost ~]# grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin



✔️ sort

  • 사용자가 지정한 파일의 내용을 정렬하거나 정렬된 파일의 내용을 병합할 때 사용한다.
  • 사용법: sort [옵션] [파일명]
  • default는 오름차순이다.
  • default는 첫번째 필드를 기준으로 정렬한다.
  • 구분자를 선언하지 않으면 공백 간격을 인지하고 필드를 구분한다.
  • 옵션
    • -r : 역순으로 정렬
    • -k : 정해진 필드를 기준으로 정렬
    • -t : 지정한 구분자를 구분자로 사용
    • -u : 정렬 후 중복된 내용을 제거
    • -f : 대소문자를 구분하지 않고 정렬
    • -n: 숫자 순서로 정렬(붙이지않으면 문자열로 인식)
    • -b : space를 무시한다.

예시

  • sample 파일을 첫번째 필드를 기준으로 오름차순으로 정렬해보자.
[root@localhost ~]# sort sample
kin 33 016-1122-3344
la 15 010-5555-5555
park 28 011-8765-4321
sung 23 010-1234-5678
yoon 46 010-4321-5678
  • sample 파일을 첫번째 필드를 기준으로 내림차순으로 정렬해보자.
[root@localhost ~]# sort -r sample
yoon 46 010-4321-5678
sung 23 010-1234-5678
park 28 011-8765-4321
la 15 010-5555-5555
kin 33 016-1122-3344
  • 3번째 필드를 기준으로 (오름차순) 정렬해보자.
[root@localhost ~]# sort -k 3 sample
sung 23 010-1234-5678
yoon 46 010-4321-5678
la 15 010-5555-5555
park 28 011-8765-4321
kin 33 016-1122-3344
  • 나이가 많은 순서대로 정렬하여 다른 파일에 저장해보자.
[root@localhost ~]# sort -k 2 sample > other_sample
[root@localhost ~]# cat other_sample
la 15 010-5555-5555
sung 23 010-1234-5678
park 28 011-8765-4321
kin 33 016-1122-3344
yoon 46 010-4321-5678
  • /etc/passwd 파일을 : 구분자를 이용하여 세 번째 필드인 uid를 기준으로 숫자 순서대로 내림차순 정렬한 후 위에서 5번째 줄 까지만 출력해보자.
[root@localhost ~]# sort -t : -k 3 -n -r /etc/passwd | head -5
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
test1:x:1001:1001::/home/test1:/bin/bash
user:x:1000:1000:user:/home/user:/bin/bash
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin

 

[root@localhost ~]# cat sample
sung 23 010-1234-5678
park 28 011-8765-4321
yoon 46 010-4321-5678
kin 33 016-1122-3344
la 15 010-5555-5555

 



✔️ sed

  • Stream Editor의 약자로, 텍스트 파일을 편집하는 유용한 명령어
  • 원본을 건드리지 않고 편집하기 때문에, 작업이 완료돼도 원본에는 영향이 없다.
  • 사용법: set [옵션] [파일명]
  • 옵션
    • p : 행을 출력( -n 옵션과 함께 사용할 경우, 선택된 행만 출력)
    • d : 선택한 행을 삭제
    • s : 문자열을 치환
    • s/가/나/g : '가' 문자열을 '나' 문자열로 대체한다.
    • n,ms/가/나/g : n번째 줄부터 m번째 줄까지 '가'를 '나'로 대체(치환)
    • -f : 파일 안의 내용을 실행
    • -e : 다중 편집을 가능하게 한다.
    • -n : 출력을 생략
    • -q : sed를 종료

예시

  • 패턴에 따라 내용이 나오나, 같은 내용이 두번 반복되어 나오는 것을 확인할 수 있다.
  • 패턴에 해당하는 부분만 보려면 -n 옵션을 사용한다.
[root@localhost ~]# sed -n '/010/p' sample
sung 23 010-1234-5678
yoon 46 010-4321-5678
la 15 010-5555-5555
  • sample 파일에서 1번부터 3번라인까지 삭제하고 출력해보자.
[root@localhost ~]# sed '1,3d' sample
kin 33 016-1122-3344
la 15 010-5555-5555
  • sample 파일의 내용을 4번째라인부터 끝까지 삭제하고 출력해보자.
[root@localhost ~]# sed '4,$d' sample
sung 23 010-1234-5678
park 28 011-8765-4321
yoon 46 010-4321-5678
  • sample 파일의 내용을 4번째 줄 까지 출력 후 종료해보자.
[root@localhost ~]# sed '4q' sample
sung 23 010-1234-5678
park 28 011-8765-4321
yoon 46 010-4321-5678
kin 33 016-1122-3344
  • 'sung' 이라는 특정 문자열이 포함된 라인을 제외하고 data 파일을 출력해보자.
[root@localhost ~]# sed '/sung/d' sample
park 28 011-8765-4321
yoon 46 010-4321-5678
kin 33 016-1122-3344
la 15 010-5555-5555
  • 'park' 이라는 특정 문자열을 'song'으로 치환해서 출력해보자.
[root@localhost ~]# sed 's/park/song/g' sample
sung 23 010-1234-5678
song 28 011-8765-4321
yoon 46 010-4321-5678
kin 33 016-1122-3344
la 15 010-5555-5555
  • sample에서 'song'이 포함된 라인을 제외하고, 이름과 전화번호로 구성된 내용을 위에서 2번째 라인부터 출력해보자.
[root@localhost ~]# sed '/song/d' sample | cut -d ' ' -f 1,3 | tail -n +2
park 011-8765-4321
yoon 010-4321-5678
kin 016-1122-3344
la 010-5555-5555
  • sample에서 'kin'을 'kim'으로 대체(치환)하고, 'la'가 포함된 줄을 제외하여 출력해보자.
[root@localhost ~]# sed -e 's/kin/kim/g' -e '/la/d' sample
sung 23 010-1234-5678
park 28 011-8765-4321
yoon 46 010-4321-5678
kim 33 016-1122-3344

 

[root@localhost ~]# sed '/010/p' sample
sung 23 010-1234-5678
sung 23 010-1234-5678
park 28 011-8765-4321
yoon 46 010-4321-5678
yoon 46 010-4321-5678
kin 33 016-1122-3344
la 15 010-5555-5555
la 15 010-5555-5555

 



✔️ ⭐awk⭐

  • awk란 이름은 awk 유틸리티를 작성한 A.V.Aho, P.J. Weinberger, B. Kernigham 의 머리글자를 따온 것
  • awk는 일종의 프로그래밍 언어이나, 일반적인 언어라기보다는 주로 패턴의 검색과 조작을 주 목적으로 만들어졌다.
  • awk으로 할 수 있는 일?
    • 다른 프로그램의 입력 형식에 맞게 변환하는 작업에 이용
    • 텍스트 파일의 전체 내용 출력
    • 파일의 특정 필드만 출력
    • 패턴이 포함된 레코드 출력
    • 특정 필드에 연산 수행 결과 출력
    • 필드 값 비교에 따라 레코드 출력
    • 특저 필드에 문자열을 추가하여 출력
  • awk 명령 기본 형식: aws [옵션] 'awk 프로그램; [argument]
  • awk program은 ' '(single quotation marks) 안에서 작성한다.
  • 옵션
    • -F : 구분자 지정
    • -f : awk 프로그램 파일 경로 지정
    • -v : awk 프로그램에서 사용될 특정 variable 값 지정
  • 패턴
    • BEGIN : 특정 명령을 실행하기 전에 먼저 실행
    • END : 특정 명령을 실행한 후 제시되는 문장을 실행
    • /정규표현식/ : 정규표현식의 패턴을 포함하는 라인에서 문장을 실행
    • 패턴1 && 패턴2 : 패턴1과 패턴2를 동시에 만족시킬 때 문장을 실행
    • 패턴1 || 패턴2 : 패턴1이나 패턴2 중 하나만 만족시켜도 문장을 실행
    • ! 패턴 : 패턴과 일치하지 않을 경우 문장을 실행
  • 연산자 : 다른 프로그래밍 언어의 연산자와 유사
    • 다만, 증감연산자는 -- 가 아닌 +- 이다.
  • awk의 내부 변수
    • FILENAME : 현재 처리되고 있는 파일 이름
    • FS : 필드 구분자
    • RS : 레코드 구분자
    • NF : 현재 레코드에서의 필드 수
    • NR : 현재 파일에서 전체 레코드 수
    • OFS : 출력시의 필드 구분자
    • ORS : 출력시의 레코드 구분자

예시

  • awk을 사용하여 1,3 필드를 출력해보자
    • 만약 전체 필드를 출력하려면 &0 인자를 사용한다.
[root@localhost ~]# awk '{print $1, $3}' data
hong 011-222-2222
park 017-333-3333
im 019-444-4444
son 016-555-5555
gil 018-666-6666
jang 011-7777-7777
lee 016-8888-8888
sa 017-9999-9999
hwang 015-555-5555
  • 25세 이상인 사람의 이름과 나이를 출력하라
[root@localhost ~]# awk '$2>25{print $1, $2}' sample
park 28
yoon 46
kin 33
  • 아래의 sample 파일에서 '세' 글자를 없애고, 문장에 맞춰 출력해보자.
[root@localhost ~]# cat sample
sung 23세 010-1234-5678
park 28세 011-8765-4321
yoon 46세 010-4321-5678
kin 33세 016-1122-3344
la 15세 010-5555-5555
[root@localhost ~]# sed 's/세//g' sample | awk '$2>25{print $1"님은 ",$2"세 입니다."}'
park님은  28세 입니다.
yoon님은  46세 입니다.
kin님은  33세 입니다.
  • sed 프로그램을 sedfile1에, awk 프로그램을 awkfile1 파일에 저장 후 실행해보자.
[root@localhost ~]# cat > sedfile1
s/세//g
[root@localhost ~]# cat > awkfile1
$2 > 25 {print $1"씨는 ",$2"세 입니다"}
[root@localhost ~]# sed -f sedfile1 sample | awk -f awkfile1
park씨는  28세 입니다
yoon씨는  46세 입니다
kin씨는  33세 입니다
  • lastb.txt 의 내용은 다음과 같다.
[root@localhost ~]# cat lastb.txt
user     ssh:notty    192.168.110.200  Mon Oct  5 17:25 - 17:25  (00:00)
user     ssh:notty    192.168.110.200  Mon Oct  5 17:13 - 17:13  (00:00)
user     ssh:notty    192.168.110.200  Mon Oct  5 17:13 - 17:13  (00:00)
user     ssh:notty    192.168.110.200  Mon Oct  5 17:13 - 17:13  (00:00)
user     ssh:notty    192.168.110.200  Mon Oct  5 17:09 - 17:09  (00:00)
user     ssh:notty    192.168.110.136  Mon Oct  5 17:08 - 17:08  (00:00)
user     ssh:notty    192.168.110.136  Mon Oct  5 17:07 - 17:07  (00:00)
userhat  ssh:notty    192.168.110.136  Mon Oct  5 16:27 - 16:27  (00:00)
userhat  ssh:notty    192.168.110.136  Mon Oct  5 16:27 - 16:27  (00:00)
userhat  ssh:notty    192.168.110.100  Mon Oct  5 16:27 - 16:27  (00:00)
userhat  ssh:notty    192.168.110.100  Mon Oct  5 16:26 - 16:26  (00:00)
userhat  ssh:notty    192.168.110.100  Mon Oct  5 16:26 - 16:26  (00:00)
user     ssh:notty    192.168.110.110  Mon Oct  5 17:13 - 17:13  (00:00)
user     ssh:notty    192.168.110.110  Mon Oct  5 17:09 - 17:09  (00:00)
user     ssh:notty    192.168.110.110  Mon Oct  5 17:08 - 17:08  (00:00)
user     ssh:notty    192.168.110.110  Mon Oct  5 17:07 - 17:07  (00:00)
userman  ssh:notty    192.168.110.110  Mon Oct  5 16:26 - 16:26  (00:00)
userman  ssh:notty    192.168.110.110  Mon Oct  5 16:25 - 16:25  (00:00)
userman  ssh:notty    192.168.110.110  Mon Oct  5 16:25 - 16:25  (00:00)
test     ssh:notty    localhost        Mon Oct  5 16:23 - 16:23  (00:00)
test     ssh:notty    localhost        Mon Oct  5 16:23 - 16:23  (00:00)
userman  ssh:notty    192.168.110.136  Mon Oct  5 16:25 - 16:25  (00:00)
userman  ssh:notty    192.168.110.136  Mon Oct  5 16:25 - 16:25  (00:00)
userman  ssh:notty    192.168.110.136  Mon Oct  5 16:25 - 16:25  (00:00)
userman  ssh:notty    192.168.110.136  Mon Oct  5 16:25 - 16:25  (00:00)
userman  ssh:notty    192.168.110.136  Mon Oct  5 16:24 - 16:24  (00:00)
test     ssh:notty    localhost        Mon Oct  5 16:23 - 16:23  (00:00)
test     ssh:notty    localhost        Mon Oct  5 16:23 - 16:23  (00:00)
test     ssh:notty    localhost        Mon Oct  5 16:23 - 16:23  (00:00)
userhat  ssh:notty    192.168.110.136  Mon Oct  5 16:26 - 16:26  (00:00)
userhat  ssh:notty    192.168.110.136  Mon Oct  5 16:26 - 16:26  (00:00)
test     ssh:notty    localhost        Mon Oct  5 16:23 - 16:23  (00:00)
root     :0           :0               Mon Oct  5 11:02 - 11:02  (00:00)

btmp begins Mon Oct  5 11:02:02 2020
  • 여기서 10번 이상 접속한 유저를 출력해보자.(심화)
    • '~' : 특정 필드 조건을 지정할 때 사용
[root@localhost ~]# awk '$3 ~ /^[0-9]/{print $3}' lastb.txt | sort | uniq -c | awk '$1>=10{print "10회 이상 접속 시도 ip = "$2}'
10회 이상 접속 시도 ip = 192.168.110.136
  • 분리해서 해석해보자.
    • awk '$3 ~ /^[0-9]/{print $3}' lastb.txt : 3번째 필드를 숫자로 시작하는 것으로 지정하고 3번째 필드를 출력**(/정규식/)**
    • sort : 정렬
    • uniq -c : 카운트 계산, uniq를 사용하기 전에는 반드시 sort해야한다.
    • awk '$1>=10{print "10회 이상 접속 시도 ip = "$2}' : 첫번째 필드(uniq -c를 통해 계산된 카운트 횟수)가 10이상인 것을 출력
  • sample 파일에서 나이의 평균을 구하는 프로그램을 구현해보자.
[root@localhost ~]# cat sedfile1
s/세//g
[root@localhost ~]# cat > awkfile2
BEGIN {
 sum = 0;
 line = 0;
}
{
 sum += $2;
 line ++;
}
END {
average = sum / line;
print "나이의 평균 : "average"세";
}
[root@localhost ~]# sed -f sedfile1 sample | awk -f awkfile2
나이의 평균 : 29세
728x90
저작자표시 (새창열림)
    'Linux' 카테고리의 다른 글
    • [Linux] shell 메타문자(Metacharacter)
    • [Linux] shell(script) 기본 문법 정리
    • [Linux] 리눅스(Linux) 퍼미션(Permission) 정리
    • vi(vim) 사용법, 명령어, 다중 편집
    nayoungs
    nayoungs
    안되면 될 때까지

    티스토리툴바