/dev
디렉토리에서 위 세 개의 표준 스트림을 앞서 언급한 파일 형태로 담고 있다.stdin
으로 표현한다.stdout
으로 줄여 표현한다.stderr
로 줄여 표현한다.리눅스의 모든 파일을 관리하는 방식
명령어 실행 (컴퓨터에게 작업을 요청 -> 프로세스 생성)
리눅스에서는 세 개의 표준 스트림을 자동으로 열게됩니다. 표준 스트림을 이용한 파이프라인과 리다이렉션이 가능합니다. 파이프라인은 한 명령의 출력을 다른 명령의 입력으로 사용하는 것이고, 리다이렉션은 명령의 입력이나 출력을 파일로 대체하는 것입니다.
리눅스에서는 표준 입력, 표준 출력, 표준 오류를 파일로 리다이렉션 할 수 있습니다. 리다이렉션을 쓰고 싶다면 기호인 >
, <
를 사용합니다. 다음은 몇 가지 예시입니다.
command > file
: command
의 출력을 file
로 저장합니다. file
이 존재하지 않으면 생성합니다. 이미 존재하는 파일이면 덮어씁니다.command1 > file1 2>&1
: command1
의 표준 출력과 표준 오류 출력을 모두 file1
로 리다이렉션합니다. 2>&1
은 표준 오류 출력을 표준 출력으로 리다이렉션 하는 것을 의미합니다.command >> file
: command
의 출력을 file
에 추가합니다. file
이 존재하지 않으면 생성합니다.command < file
: command
의 입력을 file
로부터 읽어옵니다.command << EOF
: EOF
라는 문자열을 입력할 때까지 입력된 모든 내용을 command
의 입력으로 넘깁니다.예시:
ls > file.txt
: ls
명령의 결과를 file.txt
파일에 저장합니다.
ps aux > ps.txt
: ps aux
명령의 결과를 ps.txt
파일에 저장합니다.
정확하게 말하자면, ps aux
의 출력 스트림을 ps.txt 이라는 파일로 전환하여 저장하는 것을 의미한다. 따라서 ps aux
명령의 결과는 콘솔의 화면이 아닌 ps.txt
파일에 기록된다.
ps aux 명령이 실행되지 않고 ps.txt 파일에 저장되는 모습
cat < file.txt
: file.txt
파일의 내용을 출력합니다.
sort < file.txt > sorted_file.txt
: file.txt
파일의 내용을 알파벳순으로 정렬한 후 sorted_file.txt
파일에 저장합니다.
head < ps.txt
: head
명령은 파일의 처음 부분을 설명한 라인(line) 만큼 출력하는 명령이다. 기본값으로 10줄이 세팅 되어 있다. ps.txt
파일의 처음 10줄을 head
입력 스트림으로 전환하여 보내게 된다.
head < ps.txt > sample.txt
ps.txt
의 내용을 head
명령의 입력 스트림으로 전환하여 전송한다.head
명령은 입력 받은 ps.txt
의 내용에서 10줄을 출력한다.head
명령의 출력 스트림을 sample.txt
파일에 연결한다.head
명령의 출력 스트림은 결과를 sample.txt
파일에 저장한다.파이프(Pipe)는 한 명령어의 출력을 다른 명령어의 입력으로 사용할 수 있게 해주는 기능입니다. 파이프라인(Pipeline)은 파이프를 사용해 여러 명령어를 연결하여 실행하는 것입니다.
파이프는 |
기호를 사용합니다. 다음은 파이프의 예시입니다.
command1 | command2
: command1
의 출력 스트림을 command2
의 입력 스트림으로 전달합니다.예시:
ls | grep file
: 디렉토리의 파일 목록을 출력하고, 그 중 "file" 이라는 문자열이 포함된 파일만 검색합니다.
[/bin 디렉토리 안] ls -l | grep ssh
: 결과 grep
명령어는 추후에 정리
ssh 문자열이 들어있는 모든 파일들을 검색
ps aux | grep firefox
: 프로세스 목록을 출력하고, 그 중 "firefox" 라는 문자열이 포함된 프로세스만 검색합니다.
cat file.txt | grep keyword | wc -l
: file.txt
파일의 내용 중 "keyword" 라는 문자열이 포함된 라인의 개수를 출력합니다.
위의 예시에서 grep
과 wc
는 앞선 명령어의 출력을 입력으로 받아 처리합니다. 이렇게 명령어를 파이프라인으로 연결함으로써, 여러 개의 명령어를 조합해 원하는 결과를 얻을 수 있습니다.
터미널은 하나의 프로세스이고, 명령어 실행은 해당 터미널의 정보를 기준으로 백그라운드에 자식 프로세스가 fork 되어 명령어를 실행하게 된다.
즉 ls
명령어를 입력하면, 자식 프로세스 1개가 fork 되어 백그라운드에서 부모 프로세스의 정보를 기준으로 해당 명령어 즉, stdin(표준 입력 스트림)
을 통해 정보를 입력받고 stdout(표준 출력 스트림)
을 통해 ls
명령어를 호출한 터미널로 정보를 반환한다.
그럼 파이프(Pipe)
끼리 어떻게 연결되나?
$ ls | sort | less
동작과정
ls
를 실행하는 자식 프로세스 및 파이프 명령어 개수 만큼 프로세스를 fork 한다. 프로세스는 wait
상태로 대기한다.stdin
을 통해 정보를 받는다.ls
프로세스는 ls
명령을 실행한다.ls
프로세스는 stdout
을 통해 다음 자식 프로세스 stdin
으로 데이터를 출력한다.stdout
을 return 하고 부모 프로세스는 결과를 출력한다.부모 프로세스 → … → stdin
→ 프로세스 내부 명령 실행 → stdout
→ stdin
→ … → 부모 프로세스
man <명령어>
cat <옵션> <파일 이름>
-n
: Line 번호와 함께 출력-n 옵션으로 파일 내용 앞 line 번호가 쓰여진 것을 확인할 수 있다
more <옵션> <파일 이름>
+<number>
: 예) +3 : 입력한 line 을 포함한 페이지를 추력(3번째 줄부터 출력)+/<string>
: 예) +/Gatsby : 입력한 문자열이 포함된 페이지를 추력 (Gatsby 문자열을 포함한 줄부터 출력)less <옵션> <파일 이름>
-N
: line 번호와 함께 출력head <옵션> <파일 이름>
-n <number>
: 지정한 라인까지 출력tail <옵션> <파일 이름>
-n <number>
: 지정한 라인까지 출력-f
: 즉시 종료되지 않고, 파일의 내용이 추가되는 상태를 지켜보면서 계속 이어서 출력-f
옵션은 시스템 관리자라면 필수적으로 알아야 하는 옵션wc
: 파일의 줄, 단어 및 문자 수를 계산하는 데 사용
-l
: 줄 수만 계산-w
: 단어 수만 계산-c
: 문자 수만 계산awk
: awk는 텍스트 파일을 처리하는 프로그램으로, 파일이나 텍스트 데이터를 레코드와 필드로 구분하여 처리할 수 있습니다. 레코드는 텍스트 파일에서 행을 의미하며, 필드는 레코드 안에서 구분자로 구분된 데이터를 의미합니다. awk는 이러한 레코드와 필드를 기반으로 다양한 데이터 처리 작업을 수행할 수 있습니다. 대표적으로 데이터 추출, 통계, 변환 등의 작업이 있습니다. awk는 유닉스, 리눅스 등에서 기본적으로 제공되는 명령어 중 하나입니다.
기본 구조 : awk 'condition {action}' <파일 이름>
awk
는 텍스트 파일을 처리하는 프로그램으로, 파일이나 텍스트 데이터를 레코드와 필드로 구분하여 처리하는 기능을 제공합니다. awk는 이러한 레코드와 필드를 기반으로 데이터를 추출하거나 통계, 변환 등의 작업을 수행할 수 있습니다.
자주 사용되는 기본적인 awk
명령어는 다음과 같습니다.
awk '{ print $1 }' file.txt
: file.txt
파일에서 첫 번째 필드를 출력합니다.
awk '{ print $NF }' file.txt
: file.txt
파일에서 마지막 필드를 출력합니다.
awk '{ print NF }' file.txt
: file.txt
파일에서 필드의 수를 출력합니다.
awk '/pattern/ { print }' file.txt
: file.txt
파일에서 "pattern"이 포함된 라인을 출력합니다.
awk '{ s += $1 } END { print s }' file.txt
: file.txt
파일에서 첫 번째 필드의 합을 출력합니다.
여러 가지 기능을 조합하여 사용할 수도 있습니다. 예를 들어, 다음과 같은 명령어는 file.txt
파일에서 첫 번째 필드가 3인 라인을 출력합니다.
awk '$1 == 3 { print }' file.txt
cut
: 파일에서 특정 열을 추출, 기본 구분 기호는 탭 문자
이다.
-f
:-d
: 구분 기호 설정 옵션 (ex) cut -d ‘,’
: 쉼표로 구분 기호를 설정—output-delimiter
: 출력 구분 기호 설정 (기본 설정은 입력 구분 기호와 같다)join
: 파일의 공통
paste
: 여러 텍스트 파일을 수평적으로 join
, merge
하는 유닉스 커맨드 라인 유틸리티
예제 파일
옵션
-s
: 수평이 아닌 수직으로 값을 읽어서 수평으로 출력한다.
-d
: 구분자를 지정할 수 있다.
sed
: 문자열 대체 (찾기 및 바꾸기)
sed 's/<찾을문자열>/<바꿀문자열>
-i
옵션을 주어 원본 파일을 변경해야 한다.-d
: 삭제-a
-i
: 줄 추가 또는 삽입sort
: 파일 내에서 줄이나 열을 정렬하는데 사용한다. 기본적으로 줄 시작 부분의 문자를 기준으로 다음 순서를 정렬한다.
-r
: 정렬 기준 역순으로 바꾼다-n
: 기본 정렬은 숫자 값이 아닌 문자로 숫자를 정렬한다. 숫자 값으로 정렬하려면 -n
옵션 사용-k
: 줄의 시작이 아닌 특정 열을 기준으로 파일을 정렬할 때 사용 -u
: 정렬한 다음 중복을 제거한다-f
: 대소문자 구분 안함uniq
: 중복된 항목을 제거하는 커맨드 라인 유틸리티, 보통 sort
명령어로 정렬을 한 결과를 파이프로 uniq
에 전달하여 중복 내용을 제거한다
sort input.txt | uniq
- 옵션
- `-u` : 중복되지 않은 라인만 표시한다. 위 예제에서 line 과 bat 은 포함되지 않는다.
- `-d` : 중복되는 라인만 표시한다. 위 예제에서 line 과 bat 이 해당된다.
- `-c` : 중복 횟수를 세어 준다.
- `-i` `--ignore-case` : 대소문자 구분 무시 옵션
파일 검색 기본 명령어 중 하나. 파일 권한, 소유권, 수정 날짜, 크기 등과 같은 특정 기준에 따라 파일을 검색 할 수 있다.
주의점
: 위치 선정을 하지 않을 경우 기본적으로 현재 디텍토리만 검색하기 때문에 원하는 결과를 얻지 못 할 수 있다. 찾고자 하는 위치를 지정해서 사용하는 것이 좋다.$ find <위치> <옵션> 검색할 내용
-name 내용
: 지정한 내용의 이름을 가진 파일을 찾음-type <옵션>
: 옵션에 따른 형태를 가진 파일을 찾음$ find . -name '이름' # 찾을 파일 이름을 지정해서 찾기 . 는 현재 디렉토리를 뜻함
$ find . -name '이름' -type d # -type d 는 디렉토리만 찾기
$ sudo find / -size+10M # 10M 이상 찾기 디렉토리 권한 때문에 sudo 사용
# / 는 루트 디렉토리를 뜻함
$ find . -empty # 빈 파일 찾기
$ find . -newer practice.txt # practice 파일 보다 최근에 변경된 파일 찾기
특정 파일의 위치를 모를 때 활용 find
명령어에 비해 빠르지만 데이터베이스를 이용하기 때문에 정기적인 업데이트를 필요로 한다. updatedb
에 의해서 생성된 미리 빌드된 파일들의 데이터베이스를 통해 검색이 되기 때문. 속도 향상을 위해 만들어진 유틸리티 이므로 전체적인 효율성과 정확성은 조금 떨어진다.
locate
명령어가 기본으로 제공되는 경우도 있지만 없는 경우 설치가 필요. 기존에는 locate 패키지를 사용 최근에는 mlocate 패키지를 추천한다 (관리자 권한 필요)$ sudo apt-get install mlocate
locate
명령어가 빠른 이유는 검색 DB 를 미리 생성하기 때문 (파일 목록 데이터베이스, mlocate.db
파일) 따라서 locate
명령어를 처음 사용하는 경우 DB 파일을 먼저 생성해야한다.$ sudo updatedb
$ locate gatsby.txt # 파일 이름으로 검색
$ locate -n 10 *.txt # 검색할 파일 수 지정하여 찾기 모든 txt 파일 중 10개
which
명령어는 실행 가능한 파일의 경로를 찾아주는 프로그램입니다.
검색하려는 모든 파일이 실행 파일인 경우 which
명령어가 유용. $PATH
시스템 환경변수에서 이진 파일을 매우 효과적으로 검색
$ which ls
usr/bin/ls
$ which python3
/usr/bin/python3
grep
명령어를 사용하여 파일 내에서 특정 패턴을 검색할 수 있습니다.
$ grep <패턴> <파일명>
사용 예
$ grep 'hello' file.txt
$ grep -i 'hello' file.txt
$ grep -n 'hello' file.txt
$ grep -r 'hello' ./directory
옵션 | 설명 |
---|---|
-i | 대소문자를 구분하지 않고 검색 |
-v | 지정한 패턴을 포함하지 않는 라인을 출력 |
-n | 라인 번호를 함께 출력 |
-w | 지정한 패턴이 단어로 구분되어 있는 경우에만 검색 |
-r | 하위 디렉토리를 포함하여 모든 파일에서 검색 |
-l | 파일명만 출력 |
-c | 일치하는 라인 수를 출력 |
-H | 파일명을 출력 |
-E | 확장 정규식 사용 |
-F | 정규식이 아닌 문자열 검색 |
-m | 최대 검색 결과 갯수 제한 |
grep -w
grep -n
grep -r
grep -m 10
grep '^A$B'
정규표현식(regular expression)은 문자열을 처리하는 방법 중의 하나로 특정한 조건의 문자를 '검색'하거나 '치환'하는 과정을 매우 간편하게 처리할 수 있도록 하는 수단이다. 정규표현식은 일종의 패턴(pattern)이며, 이 패턴을 통해 문자열을 처리한다.
.
: 임의의 한 문자^
: 문장의 시작$
: 문장의 끝[]
: 문자의 집합 중 하나[-]
: 문자의 집합 중 범위()
: 그룹화|
: or 연산자?
: 0 또는 1회 발생+
: 1회 이상 발생{n}
: n회 발생{n,}
: n회 이상 발생{n,m}
: n회 이상, m회 이하 발생.
모든 문자 하나를 의미합니다.^
문자열 또는 행의 시작을 의미합니다.$
문자열 또는 행의 끝을 의미합니다.[]
대괄호 안에 있는 문자 중 하나와 일치합니다.[^]
대괄호 안에 있는 문자를 제외한 문자 중 하나와 일치합니다.[-]
대괄호 안에 있는 문자의 범위와 일치합니다.()
괄호 안의 문자열을 그룹으로 묶습니다.|
둘 중 하나와 일치합니다.?
0회 또는 1회를 의미합니다.+
1회 이상을 의미합니다.{n}
n회를 의미합니다.{n,}
n회 이상을 의미합니다.{n,m}
n회 이상, m회 이하를 의미합니다.grep
: 파일 내에서 특정 패턴을 검색할 때 사용합니다.sed
: 파일 내에서 문자열을 대체(찾기 및 바꾸기)할 때 사용합니다.awk
: 파일 내에서 특정 패턴을 검색하고 조작할 때 사용합니다.find
: 파일 검색 기본 명령어 중 하나입니다.locate
: 특정 파일의 위치를 찾을 때 사용합니다.which
: 실행 파일의 위치를 식별할 때 사용합니다.https://recipes4dev.tistory.com/171
https://www.lesstif.com/lpt/linux-uniq-95879394.html
https://blog.ronin.cloud/10-simple-linux-commands/
http://hyeonjae-blog.logdown.com/posts/654302
https://www.computerhope.com/unix/uuniq.htm
https://hitomis.tistory.com/84