IT STUDY LOG
[리눅스 운영체제] 04. 출력 관련 명령 본문
# 학습 목표
- 왜 리눅스인가? ~ 출력 관련 명령어
- 리눅스를 사용하는 이유와 CLI의 장점을 이해할 수 있다.
- 파일 및 디렉토리 확인, 이동, 복사, 생성, 삭제와 관련한 기본적인 명령어를 사용할 수 있다.
- 루트 디렉토리, 홈 디렉토리 및 절대 경로와 상대 경로를 이해할 수 있다.
- 리눅스 상에서 텍스트 파일을 수정할 수 있다.
- 패키지에 대해 이해하고, 패키지 매니저를 이용해 프로그램을 설치/삭제할 수 있다.
- 표준 스트림을 이해하고, 출력과 입력을 파이프라인으로 연결할 수 있다.
- 파일과 디렉토리를 패턴으로 찾을 수 있다.
# 학습 내용
1. 표준 스트림과 stdin, stdout, stderr
[발표 주제] 표준스트림과 stdin, stdout, stderr이 무엇인가요?
- 표준 스트림(Standard Stream)
- 개념
- Unix 시스템에서는 입출력 작업을 할 때 장치를 추상화해서 파일을 다루는 것처럼 만들어 해결
- 스트림이란 프로그램을 드나드는 데이터의 흐름
- 장치 파일로 데이터가 흐르는 것을(데이터의 입력과 출력) 스트림으로 정의
- 표준 스트림 : 프로그램 실행 시 자동적으로 열리는 기본 3개의 스트림
- 종류
stdin stdout stderr - 표준 입력(Standard Input)
- 프로그램으로 들어가는 입력값의 데이터 스트림
- 리눅스 쉘의 경우 표준 입력 설정이 키보드
- 모든 프로그램이 입력을 요구하는 것은 아님- 표준 출력(Standard Output)
- 프로그램이 출력 데이터를 기록하는 스트림
- 표준 출력은 텍스트 터미널에서 이루어짐
- 모든 프로그램이 출력을 요구하는 것은 아님- 표준 오류(Standard Error)
- 프로그램이 오류 메세지나 진단 출력하기 위한 스트림
- 개념
- 파일 디스크립터
- 프로세스 생성
- in User Area
- PCB(프로세스 제어 블럭) 생성
- 개별 프로세스별 관리 정보(프로세스 번호, 프로세스 상태, PC 등) 를 담고 있음
- FD(파일 디스크립터 테이블) 생성
- 개별 프로세스 별로 오픈한 파일을 관리하기 위한 테이블
- 프로세스 내에서 오픈한 각각의 파일 식별을 위해 양의 정수값을 파일 디스크립터라고 함 (ex) 0은 표준 입력, 1은 표준 출력, 2는 표준 에러
- PCB(프로세스 제어 블럭) 생성
- in Kernel Area
- System open-file table 생성
- Active vnode table 생성
- in User Area
- 프로세스 생성
# lsof(시스템에서 열린 파일 목록 출력) 명령어를 통해 FD 확인
root@virtualBox:/$ lsof -p 2734 -nP
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 2734 root 0u CHR 136,0 0t0 3 /dev/pts/0 # 표준 입력
bash 2734 root 1u CHR 136,0 0t0 3 /dev/pts/0 # 표준 출력
bash 2734 root 2u CHR 136,0 0t0 3 /dev/pts/0 # 표준에러
출처 : 탑스팟 정보보안기사 실기 이론편(정일영, 강재순, 조현준 공저)
2. 파이프라인과 리다이렉션
[발표 주제] 파이프라인과 리다이렉션이 무엇인지 예시를 들어 설명하세요.
- 리다이렉션
- 입출력 재지정(I/O Redirection)
- 표준 스트림의 흐름을 바꿔 다른 경로의 파일로 표준 입출력을 할 수 있도록 하는 것
- 입력 문법
문법 사용방법 설명 > 명령어 > 파일 입력 재지정, 단 기존 내용이 있을 시 덮어쓰기됨 < 명령어 < 파일 출력 재지정(default : 표준 출력), 단 기존 내용이 있을 시 덮어쓰기됨 >> 명령어 >> 파일 입력 재지정, 단 기존 내용이 있을 시 추가하여 작성됨 << 명령어 << 파일 출력 재지정(default : 표준 출력), 단 기존 내용이 있을 시 추가하여 작성됨 - 사용 예시
# ps aux 명령 결과를 출력 재지정하여 터미널이 아닌 ps.txt로 출력
root@-VirtualBox:/# ps aux > ps.txt
root@-VirtualBox:/# cat ps.txt
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.4 0.3 169432 13100 ? Ss 09:51 0:07 /lib/systemd/systemd --system --deserialize 31
root 2 0.0 0.0 0 0 ? S 09:51 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 09:51 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< 09:51 0:00 [rcu_par_gp]
root 5 0.0 0.0 0 0 ? I< 09:51 0:00 [slub_flushwq]
root 6 0.0 0.0 0 0 ? I< 09:51 0:00 [netns]
root 8 0.0 0.0 0 0 ? I< 09:51 0:00 [kworker/0:0H-events_highpri]
# (중략)
# ps.txt를 head(파일 처음 부분을 라인만큼 출력, 기본값 : 10줄) 명령어의 입력으로 재지정
root@-VirtualBox:/# head < ps.txt
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.4 0.3 169432 13100 ? Ss 09:51 0:07 /lib/systemd/systemd --system --deserialize 31
root 2 0.0 0.0 0 0 ? S 09:51 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 09:51 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< 09:51 0:00 [rcu_par_gp]
root 5 0.0 0.0 0 0 ? I< 09:51 0:00 [slub_flushwq]
root 6 0.0 0.0 0 0 ? I< 09:51 0:00 [netns]
root 8 0.0 0.0 0 0 ? I< 09:51 0:00 [kworker/0:0H-events_highpri]
root 10 0.0 0.0 0 0 ? I< 09:51 0:00 [mm_percpu_wq]
root 11 0.0 0.0 0 0 ? S 09:51 0:00 [rcu_tasks_rude_]
# ps.txt 파일을 head 명령어의 입력으로 재지정 후, sample.txt로 출력 재지정
root@-VirtualBox:/# head < ps.txt > sample.txt
root@-VirtualBox:/# cat sample.txt
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.4 0.3 169432 13100 ? Ss 09:51 0:07 /lib/systemd/systemd --system --deserialize 31
root 2 0.0 0.0 0 0 ? S 09:51 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 09:51 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< 09:51 0:00 [rcu_par_gp]
root 5 0.0 0.0 0 0 ? I< 09:51 0:00 [slub_flushwq]
root 6 0.0 0.0 0 0 ? I< 09:51 0:00 [netns]
root 8 0.0 0.0 0 0 ? I< 09:51 0:00 [kworker/0:0H-events_highpri]
root 10 0.0 0.0 0 0 ? I< 09:51 0:00 [mm_percpu_wq]
root 11 0.0 0.0 0 0 ? S 09:51 0:00 [rcu_tasks_rude_]
- 파이프
- 둘 이상의 명령을 함께 묶어 출력의 결과를 다른 프로그램의 입력으로 전환
- 입력 문법
문법 의미 명령어1 | 명령어2 [| 명령어3 ...] 선행 명령의 출력 데이터가 후행 명령의 입력 데이터로 전환 - 사용 예시
# ls -l 명령어를 수행한 출력 데이터가 grep 명령어의 입력으로 전달
root@-VirtualBox:/bin# ls -l | grep ssh
lrwxrwxrwx 1 root root 3 3월 9 10:51 slogin -> ssh
-rwxr-xr-x 1 root root 789448 3월 30 2022 ssh
-rwxr-xr-x 1 root root 370976 3월 30 2022 ssh-add
-rwxr-sr-x 1 root ssh 350504 3월 30 2022 ssh-agent
-rwxr-xr-x 1 root root 1455 3월 30 2022 ssh-argv0
-rwxr-xr-x 1 root root 10658 2월 14 2020 ssh-copy-id
-rwxr-xr-x 1 root root 477488 3월 30 2022 ssh-keygen
-rwxr-xr-x 1 root root 465208 3월 30 2022 ssh-keyscan
3. 출력 관련 명령어 - 파일 읽기
- man: 매뉴얼(도움말 보기) 명령어
- 명령어에 대한 매뉴얼 정보 제공
- 입력 문법
문법 의미 man 명령어 명령어에 대한 매뉴얼 정보 제공
- cat: 파일 내용 출력
- 파일 내용 터미널에 출력, 출력 내용을 다른 CLI 도구나 파일로 리다이렉트
- 입력 문법
문법 옵션 cat [옵션] 파일이름 - n : line 번호를 함께 출력 - 사용 예시
$ cat -n gatsby.txt # 라인 넘버와 함께 내용 출력
1 In my younger and more vulnerable years my father gave me some advice
2 that I’ve been turning over in my mind ever since.
3 “Whenever you feel like criticizing any one,”
4 he told me,
5 “just remember that all the people in this world haven’t had the advantages that you’ve had.”
6 He didn’t say any more,
7 but we’ve always been unusually communicative in a reserved way,
8 and I understood that he meant a great deal more than that.
9 In consequence,
10 I’m inclined to reserve all judgments,
11 a habit that has opened up many curious natures to me and also made me the victim of not a few veteran bores.
12 The abnormal mind is quick to detect and attach itself to this quality when it appears in a normal person,
13 and so it came about that in college I was unjustly accused of being a politician,
14 because I was privy to the secret griefs of wild, unknown men. Most of the confidences were unsought —
15 frequently I have feigned sleep, preoccupation, or a hostile levity
16 when I realized by some unmistakable sign that an intimate revelation was quivering on the horizon;
# 하략
! Action Items !
- 위의 파일에서 16번째 줄의 내용은 무엇일까요?
> 16 when I realized by some unmistakable sign that an intimate revelation was quivering on the horizon;
- more: 파일을 화면 단위로 끊어서 출력
- 파일 내용을 확인하는 명령어 중 화면 단위로 끊어서 출력하는 명령어
- 텍스트 파일의 내용을 한 번에 한 화면씩 출력
- Space : 다음 페이지 출력
- b : 이전 페이지 출력
- Enter : 다음 줄 출력
- q : 종료
- 입력 문법
문법 옵션 more [옵션] 파일이름 +숫자 : 입력한 line을 포함한 페이지를 출력 (ex) +3의 경우 3번째 줄부터 출력
+/문자열 : 입력한 문자열이 포함된 페이지를 출력 (ex) +Gatsby의 경우 해당 문자열을 포함한 줄부터 출
- less: 파일 내용 출력
- 터미널 세션 방해 없이 화살표 키 만으로 파일 내에서 양방향 탐색이 가능
- 파일의 앞, 뒤쪽으로 이동 가능
- 구동 전에 파일 전체를 읽지 않아 큰 용량 파일을 빠르게 읽기 가능
- 입력 문법
문법 옵션 less [옵션] 파일이름 - N : line 번호를 함께 출력
- head: 파일 앞부분 출력
- 터미널에서 직접 파일(또는 파이프라인으로 넘어온 데이터)의 시작을 보기 가능
- 기본적으로 상단 10개 라인 출력
- 입력 문법
문법 옵션 head [옵션] 파일이름 - n 숫자 : 지정한 line 까지 출력 - 사용 예시
$ head -n 7 gatsby.txt # 가장 상단에서 7줄 출력
In my younger and more vulnerable years my father gave me some advice
that I’ve been turning over in my mind ever since.
“Whenever you feel like criticizing any one,”
he told me,
“just remember that all the people in this world haven’t had the advantages that you’ve had.”
He didn’t say any more,
but we’ve always been unusually communicative in a reserved way,
- tail: 파일 뒷부분 출력
- 파일의 마지막 행을 기준으로 지정한 행까지의 파일 내용 일부를 출력
- 기본적으로 마지막 10줄 출력
- 오류, 파일 로그 확인 시 유용하게 사용
- 입력 문법
문법 옵션 head [옵션] 파일이름 -n : 지정한 라인까지 출력
-f : 즉시 종료되지 않고 파일 내용 추가되는 상태를 지켜보며 계속 이어 출력
$ tail gatsby.txt
$ tail -n 7 gatsby.txt
! Action Items !
- 다음의 리눅스 명령어는 어떻게 쓰이는지 알아봅시다. 제공되는 레퍼런스를 활용해서 알아보세요.
- awk: 파일로부터 레코드(record)를 선택하고, 선택된 레코드에 포함된 값을 조작하거나 데이터화하는 것을 목적으로 사용하는 프로그램
- cut: 각 줄마다 필요한 부분만 잘라내어 반환해주는 명령어
- 옵션
- -d: 구분자 설정(기본적으로 구분자를 tab 문자로 사용)
- -f: 추출할 위치 또는 구간 설정
- 옵션
- join: 공통 필드를 일치시켜 두 텍스트 파일의 데이터를 병합
- paste: 리눅스 파일 행 병합 도구, 각 파일의 행들을 읽어서 대응되는 것을 탭으로 구분하여 병합함
- se: 명령이 존재하지 않음
- sort: 숫자순, 알파벳 순으로 정렬해주는 명령어
- 옵션
- -r: 내림차순 정렬(기본적으로 오름차순)
- -t: 구분자 지정
- -k: 정렬할 열 지정
- -n: 숫자로 해석해서 값의 크기로 정렬
- -b: 포함된 공백 무시
- 옵션
- uniq: 중복을 제거하는 명령어(단, 이어진 중복만 제거하므로 sort 명령어로 미리 정렬한 다음 사용하면 모든 중복을 제거)
- 옵션
- -c: 몇 번 중복되었는지도 출력
- 옵션
- wc: 지정한 파일이나 파이프라인으로 넘어온 내용의 줄, 단어, 문자 수를 출력해주는 명령어
- 옵션(별도의 옵션 지정이 없으면 모두 줄, 단어, 문자 수 모두 출력)
- -l: 줄 수
- -w: 단어 수
- -c: 문자 수
- 옵션(별도의 옵션 지정이 없으면 모두 줄, 단어, 문자 수 모두 출력)
출처: https://jupiny.com/2017/07/09/linux-command-4-cut-sort-uniq-wc/, https://zetawiki.com/
4. 출력 관련 명령어 - 파일 및 디렉토리 찾기
- find: 파일 검색
- 파일 권한, 소유권, 수정 날짜, 크기 등과 같은 특정 기준에 따라 파일을 검색
- 경로 지정을 하지 않을 경우 현재 디렉터리에서만 검색
- 입력 문법
문법 의미 find [위치] [옵션] 검색할 내용 -name 내용 : 지정한 내용의 이름을 가진 파일을 찾음
-type [옵션] : 옵션에 따른 형태를 가진 파일을 찾음
$ find . -name “이름*” # 찾을 파일 이름을 지정해서 찾기
$ find . -name “이름*” -type d # 이 중에 디렉토리만 찾기
$ sudo find / -size+10M # 파일 크기 지정해서 찾기 → 디렉토리 권한 때문에 sudo 사용
$ find . -empty # 빈파일 찾기
$ find . -newer practice.txt # practice 파일 보다 최근에 변경된 파일 찾기
- locate: 특정 파일 위치 찾기
- 특정 파일 위치 모를 때 활용 가능
- find보다 빠르나 DB 정기 업데이트가 필요 (전체적인 효율성과 정확성은 떨어지는 편)
- mlocate 패키지 설치 필요
$ sudo apt-get install mlocate # 패키지 설치
$ sudo updatedb # db 파일 갱신
# 대표적인 사용 예시
$ locate gatsby.txt # 파일 이름으로 검색하기
$ locate -n 10 *.txt # 검색할 파일 수 지정하여 찾기
- which: 실행파일 위치 식별
- 검색하려는 모든 파일이 실행 파일일 경우 유용
- 특정 매개 변수를 입력 받아 $PATH 시스템 환경 변수에서 이진 파일을 검색 -> 현재 사용하고 있는 명령어 실행파일 또는 링크의 위치를 알아낼 수 있음
- bash 쉘 사용할 프로그램의 경로 나타냄
- 입력 문법
문법 의미 which 명령어 해당 명령어가 위치하고 있는 경로를 나타냄 - 사용 예시
$ which ls
/usr/bin/ls
$ which ps
/usr/bin/ps
5. 출력 관련 명령어 - 패턴으로 찾기 (grep)
- grep : 텍스트 검색
- grep : 파일이나 표준 입력을 검색해 주어진 정규 표현식과 맞는 줄을 찾아 프로그램의 표준 출력으로 출력
- 정규 표현식 : 특정 규칙을 가진 문자열 집합을 표현하기 위한 형식 언어
- 사용 예시
# 대상 파일에서 문자열 검색 : grep "문자열" [filename]
$ grep "Gatsby" gatsby.txt
Only Gatsby, the man who gives his name to this book, was exempt from my reaction —
Gatsby, who represented everything for which I have an unaffected scorn.
No — Gatsby turned out all right at the end;
it is what preyed on Gatsby, what foul dust floated in the wake of his dreams
# 현재 디렉토리의 모든 파일에서 문자열 검색 : grep "문자열" *
$ grep "Gatsby" *
Only Gatsby, the man who gives his name to this book, was exempt from my reaction —
Gatsby, who represented everything for which I have an unaffected scorn.
No — Gatsby turned out all right at the end;
it is what preyed on Gatsby, what foul dust floated in the wake of his dreams
# 특정 확장자를 가진 모든 파일에서 문자열 검색 : grep "문자열" *.확장자
$ grep "dreams" *.txt
it is what preyed on Gatsby, what foul dust floated in the wake of his dreams
# 대소문자 구분하지 않고 문자열 검색 : grep -i "문자열" [filename]
$ grep -i "DREAMS" gatsby.txt
it is what preyed on Gatsby, what foul dust floated in the wake of his dreams
# 매칭되는 패턴이 존재하지 않는 라인 선택 : grep -v "문자열" [filename]
$ grep -vi "HE" gatsby.txt
that I’ve been turning over in my mind ever since.
but we’ve always been unusually communicative in a reserved way,
In consequence,
I’m inclined to reserve all judgments,
and so it came about that in college I was unjustly accused of being a politician,
frequently I have feigned sleep, preoccupation, or a hostile levity
Reserving judgments is a matter of infinite hope.
I am still a little afraid of missing something if I forget that,
but after a certain point I don’t care what it’s founded on.
Gatsby, who represented everything for which I have an unaffected scorn.
If personality is an unbroken series of successful gestures,
This responsiveness had nothing to do with that flabby impressionability
it was an extraordinary gift for hope, a romantic readiness
and which it is not likely I shall ever find again.
! Action Items !
다음의 명령을 실행할 수 있는 grep 명령어의 옵션을 찾아보세요.
# 단어 단위로 문자열 검색 : grep -w "문자열" 파일명
$ grep -w "he" gatsby.txt
he told me,
and I understood that he meant a great deal more than that.
as if he were related to one of those intricate machines that register earthquakes ten thousand miles away.
# 매칭되는 문자열만 검색 : grep -o "문자열" 파일명
# 최대 검색 결과 갯수 제한 : grep -m 숫자 "문자열" 파일명
$ grep -m 1 "he" gatsby.txt
In my younger and more vulnerable years my father gave me some advice
#검색된 문자열이 포함된 라인 번호 출력 : grep -n "문자열" 파일명
$ grep -n "dream" gatsby.txt
41:it is what preyed on Gatsby, what foul dust floated in the wake of his dreams
#하위 디렉토리를 포함한 모든 파일에서 문자열 검색 : grep -r "문자열" 파일명
$ grep -r "dream" * # /home/devops로 구성된 디렉터리 구조 내 home 디렉터리에서 검색
devops/gatsby.txt:it is what preyed on Gatsby, what foul dust floated in the wake of his dreams
# 문자열 A로 시작해서 문자열 B로 끝나는 패턴 찾기 (정규표현식으) : grep -E "패턴(정규표현식)" 파일명
$ grep -Ei '^a.*b$' gatsby.txt
AasdjglasjvkqjewlrijasdlfjdslkafjaB
abakjsdlfkjalekjrlqkjaselkfjadslB
Aadsflkajdslfkjasdlkfjadslkfjb
aalsdkjfalksdjflaksdjflaksdjflkb
출처: https://coding-factory.tistory.com/802
'devops bootcamp 4 > 서비스 운영 기초' 카테고리의 다른 글
[리눅스 운영체제] 06. 프로세스 관리 (0) | 2023.03.13 |
---|---|
[리눅스 운영체제] 05. 관리자로서의 리눅스 (1) | 2023.03.11 |
[리눅스 운영체제] 03. 패키지와 패키지 매니저 (0) | 2023.03.09 |
[리눅스 운영체제] 02. CLI 기본 명령어 (0) | 2023.03.09 |
[리눅스 운영체제] 01. 왜 리눅스인가? (0) | 2023.03.09 |
Comments