아이티윌_데이터 분석 55기/강의내용_Linux

#2 2일차_편집기 및 디렉토리 / 파일 확인하기 / 패턴 검색 / 파이프

ecosso 2026. 7. 15. 16:19

01 vi 편집기 사용하기

 -01 입력모드

 -02 명령모드(편집모드) (ESC)

 

02 mkdir - 디렉토리 생성

 

03 rm - 파일 / 디렉토리 삭제

 

04 mv - 파일 / 디렉토리 이동

 

05 파일 확인하기

 -01 cat : 파일 전체 출력

 -02 head : 위에서부터 n행 출력

 -03 tail : 밑에서부터 n행 출력

 -04 more : 파일을 순차적으로 출력

 -05 less : 파일을 순차적으로 출력

 

06 grep : 텍스트 패턴 검색

 

07 wc - 글자 수 세기

 

08 파이프

 

09 쉘 사용하기


* 에러발생 시

 1) VMware에서 서버 구동이 안되는 이유 (~lock)

  > 해결 : lock 디렉토리 삭제 (ubuntu 설치 위치 하위 디렉토리에 .lck 폴더 모두 삭제)

 

 2) putty 접속이 안되는 경우 (network error)

  > 해결 : vmware으로 서버 접속 후 IP 확인


01 vi 편집기 사용하기

 화면 단위 편집기이다.

 문법은 vi 파일명이다.

 

 -01 입력모드

 텍스트를 입력할 수 있는 모드이다.

i 현재 커서 기준으로 입력
a 다음 커서 기준으로 입력
o 다음 라인 기준으로 입력

 -02 명령모드(편집모드) (ESC)

 커서이동, 삭제 등을 할 수 있는 모드이다.

 

 1) 커서이동 : h (왼쪽) j (아래) k (위) l (오른쪽)0

  - 10G : 10번째 라인으로 이동

  - 1G, gg : 첫번 째 라인으로 이동

  - G : 마지막 라인으로 이동

  - ^ : 해당 커서의 맨 앞으로 이동

  - $ : 해당 커서의 맨 끝으로 이동

 

 2) 삭제

  - x : 뒤 글자 삭제. 삭제하려는 글자 수 지정 가능

   > ex) 10x -> 현재커서 뒤 10개 글자 삭제 

  - X : 앞 글자 삭제 . 삭제하려는 글자 수 지정 가능

   > ex) 10X -> 현재커서 앞 10개 글자 삭제 

  - dw : 단어삭제

  - dd : 라인삭제

  > ex) 10dd -> 현재 행 포함 10개 라인 삭제

 

 3) 수정

  - r : 한 글자 치환

  - cw : 단어 단위 치환

 

 4) 복사 / 붙여넣기

  - yy : 행 복사

  - p (다음라인에), P (현재라인에) : 붙여넣기

 

 5) 실행취소

  - u : 직전 수정 실행 취소

  - U : 해당 라인의 모든 수정 취소


 ** 마지막행 명령키

 1) 검색

  - /단어

  - n (다음), N (이전)

 

 2) 치환

  - : [범위] s/old/new [g] (범위, g 옵션은 생략 가능)

 

 * g : 각 라인마다 모든 단어를 수정하는 옵션으로, 해당 옵션을 사용하지 않으면 첫 번째 단어 하나만 수정됨

 * 범위 : 생략 시 현재 행 수정

  - 1,100 -> 1 ~100 라인 범위 선택

  - 1,$ -> 처음부터 끝까지 범위 선택

  - % -> 전체 범위

%s/tcp/TCP 

tcp가 TCP로 모두 변환되었음을 확인할 수 있다.

 

 

%s/tim/TIM/g

한 라인에 있는 모든 tim이 TIM으로 치환되었음을 확인할 수 있다.

 

삭제의 경우 replace와 비슷하다.

%s/server//g와 같은 형태로 공백으로 지정하면 된다.

또는 301,321s/TCP//g 형태도 가능하다.

 

만약 1~10열에 주석처리를 하고 싶다면

1,10s/^/#/

주석처리를 해제하고 싶다면

1,10s/^#//

 

yy 라인 단위 복사하기

p 다음 라인 붙여넣기

P 현재 커서 위치에 바로  붙여넣기

 

dd p 잘라넣기 후 붙여넣기

 

: set nu

행번호가 출력된다.

여기서 50 G (대문자) 를 입력하게 되면 커서가 50번째 행으로 이동하게 된다.

50번째 행으로 이동하였음을 확인할 수 있다.

shift G를 누르게 되면 마지막 행으로 이동한다.

마지막 행으로 이동하였음을 확인할 수 있다.

: 100을 통해 100번째 행으로도 이동할 수 있다.

 

100번째 행으로 이동하였음을 확인할 수 있다.

마찬가지로 : $를 통해 마지막 행으로 이동할 수 있다.

 

마지막 행으로 이동하였음을 알 수 있다.

 

[ 연습문제 ]

services 파일을 vi 편집기로 수정
:set nu
1) 100 라인이동
2) # 뒤에 test 글자 입력
3) 다음 라인(101)의 services 삭제
4) 107번 라인의 맨 끝에 two 삽입
5) 103번라인부터 3줄을 복사해서 107번 뒤에 붙여넣기
6) 94~97번 라인 삭제
7) 100~150라인에 대해 udp 삭제
8) 마지막 라인 이동하여 services 를 대문자로 변경 후 저장


02 mkdir - 디렉토리 생성

 * 사용법

 mkdir [ 옵션 ] 디렉토리1 디렉토리2 ...

 

 * 옵션

 -p : 상위 디렉토리도 함께 생성하는 옵션

 ex) 

  mkdir test/dir1 -> test 디렉토리가 존재할 때만 정상적으로 생성됨

  mkdir -p test/dir1 -> test 디렉토리가 없는 경우 새로 생성 후 하위에 dir1 디렉토리를 생성함

상위 디렉토리가 없기 때문에 dir1 디렉토리 생성이 불가능하다.

 

-p 옵션을 통해 dir1 디렉토리와 상위 디렉토리가 함께 생성되었다.


03 rm - 파일 / 디렉토리 삭제

 * 사용법

 rm [ 옵션 ] 대상1 대상2 대상3 ...

 

 * 옵션

 -i : 대화식 옵션

 -r : 디렉토리 삭제 옵션 (빈 디렉토리가 아니더라도 삭제 가능)

 

 +) rmdir : 디렉토리 삭제 (빈 디렉토리만 삭제 가능)

itwill@ubuntu:~/linux_ex/ch2$ ls
services  sudo.conf  test
itwill@ubuntu:~/linux_ex/ch2$ mkdir test2
itwill@ubuntu:~/linux_ex/ch2$ ls
services  sudo.conf  test  test2
itwill@ubuntu:~/linux_ex/ch2$ rmdir test2
itwill@ubuntu:~/linux_ex/ch2$ ls
services  sudo.conf  test
itwill@ubuntu:~/linux_ex/ch2$ rmdir test
rmdir: failed to remove 'test': Directory not empty

 

내부에 파일이 있기 때문에 test는 삭제가 안된다.

rmdir는 원칙적으로 비어 있는 디렉토리만 삭제 가능하며, 별도의 옵션이 존재하지 않는다.

 

itwill@ubuntu:~/linux_ex/ch2$ touch a.sh
itwill@ubuntu:~/linux_ex/ch2$ touch b.sh
itwill@ubuntu:~/linux_ex/ch2$ ls
a.sh  b.sh  services  sudo.conf  test
itwill@ubuntu:~/linux_ex/ch2$ rm a.sh b.sh services
itwill@ubuntu:~/linux_ex/ch2$ ls
sudo.conf  test
itwill@ubuntu:~/linux_ex/ch2$

 

빈 파일 a.sh, b.sh 생성 후 a.sh, b.sh, services 를 rm으로 삭제할 수 있다.

rm으로 삭제 진행 시 문제를 일으킬 수 있기 때문에 이 역시 대화식 옵션을 지정하는 것이 좋다.

 

rm -i c.sh

itwill@ubuntu:~/linux_ex/ch2$ touch c.sh
itwill@ubuntu:~/linux_ex/ch2$ rm -i c.sh
rm: remove regular empty file 'c.sh'? n
itwill@ubuntu:~/linux_ex/ch2$ rm -i c.sh
rm: remove regular empty file 'c.sh'? y

04 mv - 파일 / 디렉토리 이동

 * 사용법

 mv [ 옵션 ] 인수1 인수2

 

 * 옵션

 -i : 대화식 옵션

 mv 역시 덮어씌우기의 위험이 있기 때문에 -i 사용이 필요하다.

itwill@ubuntu:~/linux_ex/ch2$ ls
a.sh  sudo.conf  test
itwill@ubuntu:~/linux_ex/ch2$ mv a.sh test
itwill@ubuntu:~/linux_ex/ch2$ ls
sudo.conf  test
itwill@ubuntu:~/linux_ex/ch2$ ls test
a.sh  dir1

05 파일 확인하기

/etc/passwd

모든 계정의 정보를 관리하는 파일이기 때문에 가급적 복사본을 cp로 만들고 실습을 진행하는 것이 좋다.

 

 -01 cat : 파일 전체 출력

  * 사용법

  cat [ 옵션 ] 파일명

  

  * 옵션

  -n : 행번호와 함께 출력

 

cat passwd

itwill@ubuntu:~/linux_ex/ch2$ cp /etc/passwd .
itwill@ubuntu:~/linux_ex/ch2$ ls
b.sh  passwd  sudo.conf  test
itwill@ubuntu:~/linux_ex/ch2$ cat passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
...

 

모든 정보가 출력되기 때문에 너무 큰 파일에 cat을 사용하지 않는 것이 좋다.


 -02 head : 위에서부터 n행 출력

  * 사용법

  head  [ 옵션 ] 파일명

  

  * 옵션

  -10 : 위에서부터 0개 행 출력

 

혹은 상위 10줄만 미리 확인할 수도 있다.

head passward

itwill@ubuntu:~/linux_ex/ch2$ head passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
itwill@ubuntu:~/linux_ex/ch2$

 

혹은 원하는 행만큼 조회할 수도 있다.

상위 5줄만 출력하기 위해서는 head -5 passwd

itwill@ubuntu:~/linux_ex/ch2$ head -5 passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
itwill@ubuntu:~/linux_ex/ch2$

 -03 tail : 밑에서부터 n행 출력

  * 사용법

  tail  [ 옵션 ] 파일명

  

  * 옵션

  -10 : 밑에서부터 0개 행 출력

  -n + 10 : 10번 라인부터 끝까지 출력

 

마찬가지로 하위 5줄만 출력하기 위해서는 head 대신 tail을 사용하면 된다.

tail -5 passwd

itwill@ubuntu:~/linux_ex/ch2$ tail -5 passwd
rtkit:x:978:978:RealtimeKit:/proc:/usr/sbin/nologin
colord:x:977:977:colord colour management daemon:/var/lib/colord:/usr/sbin/nologin
gdm:x:975:975:Gnome Display Manager:/var/lib/gdm3:/bin/false
itwill:x:1000:1000:itwill:/home/itwill:/bin/bash
sshd:x:973:65534:sshd user:/run/sshd:/usr/sbin/nologin

 

25번부터 마지막까지 출력을 원할 때에는 -n 옵션을 사용한다.

tail -n +25 passwd

itwill@ubuntu:~/linux_ex/ch2$ tail -n +25 passwd
tss:x:987:987:tss user for tpm2:/:/usr/sbin/nologin
uuidd:x:101:105::/run/uuidd:/usr/sbin/nologin
systemd-oom:x:986:986:systemd Userspace OOM Killer:/:/usr/sbin/nologin
whoopsie:x:102:108::/nonexistent:/bin/false
dnsmasq:x:999:65534:dnsmasq:/var/lib/misc:/usr/sbin/nologin
...

 

+)

-f 옵션 : 새로 입력되는 내용을 계속 이어서 보기 (로그파일 모니터링시 주로 사용)

보통 로그처럼 계속 갱신되는 데이터 조회 시 사용한다.

일반적으로 cat을 사용하면 조회 시점까지의 로그가 조회되겠으나, f는 갱신되는 데이터를 실시간으로 보여준다.

 

리다이렉션은 > 사용

표준출력장치를 리다이렉션했다. 라고 표현한다.

모니터가 아닌 python.log에 출력을 지정했다.

itwill@ubuntu:~/linux_ex/ch2$ touch python.log
itwill@ubuntu:~/linux_ex/ch2$ ls
b.sh  passwd  python.log  sudo.conf  test
itwill@ubuntu:~/linux_ex/ch2$ echo "test..."
test...
itwill@ubuntu:~/linux_ex/ch2$ echo "test..." > python.log

 

python.log를 cat으로 조회하면 다음과 같이 test...가 출력된다.

itwill@ubuntu:~/linux_ex/ch2$ cat python.log
test...

 

리다이렉션은 한 번만 지정하면 덮어쓰게 된다.

여러 번 출력을 원할 시에는 > 가 아닌 >>를 사용해야한다.

 

리다이렉션을 세 번 지정한다면, 세 번 출력된다.

itwill@ubuntu:~/linux_ex/ch2$ echo "test..." >> python.log
itwill@ubuntu:~/linux_ex/ch2$ cat python.log
test...
test...
itwill@ubuntu:~/linux_ex/ch2$ echo "test..." >> python.log
itwill@ubuntu:~/linux_ex/ch2$ cat python.log
test...
test...
test...
itwill@ubuntu:~/linux_ex/ch2$

 -04 more : 파일을 순차적으로 출력

 * 이전 화면 출력하기 옵션은 버젼 / 종류에 따라서 사용이 불가능할 수도 있다.

 

파일이 너무 큰 경우에는 more 옵션을 사용하기도 한다.

한 줄씩 조회하려면 엔터, 한 페이지씩 조회하려면 스페이스바를 누르면 된다.

itwill@ubuntu:~/linux_ex/ch2$ more /etc/services
# Network services, Internet style
#
# Updated from https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml .
#
# New ports will be added on request if they have been officially assigned
# by IANA and used in the real-world or are needed by a debian package.
# If you need a huge list of used numbers please install the nmap package.

tcpmux          1/tcp                           # TCP port service multiplexer
echo            7/tcp
echo            7/udp
...

snpp            444/tcp                         # Simple Network Paging Protocol
--More--(22%)

 

해당 상황에서 빠져나오고 싶으면 q를 입력하면 된다.


 -05 less : 파일을 순차적으로 출력

 more와 비슷하나 페이지를 넘기는 느낌이 다소 다르다.

itwill@ubuntu:~/linux_ex/ch2$ less /etc/services
# Network services, Internet style
#
# Updated from https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml .
#
# New ports will be added on request if they have been officially assigned
# by IANA and used in the real-world or are needed by a debian package.
# If you need a huge list of used numbers please install the nmap package.

tcpmux          1/tcp                           # TCP port service multiplexer
echo            7/tcp
echo            7/udp
discard         9/tcp           sink null
discard         9/udp           sink null
...

06 grep : 텍스트 패턴 검색

 * 사용법

 grep [ 옵션 ] 패턴 파일명

 

 * 옵션

 - i : 대소문자 구분 x

 - w : 정확한 일치 패턴만 찾기

 - l : 패턴을 포함하는 파일명 리턴하기

 

* 현재 디렉토리에 존재하는 모든 파일의 내용 중에서 python이 포함되면 모두 리턴할 수 있게 설정도 가능하다.

 ex) $ grep -l python *

      python.log     <- python 단어가 포함된 파일명 출력

 

* 파일명에 패턴이 존재하는 것이 아니라, 내용에 해당 패턴이 존재하는 파일명을 리턴한다.

itwill@ubuntu:~/linux_ex/ch2$ touch a.log
itwill@ubuntu:~/linux_ex/ch2$ touch b.log
itwill@ubuntu:~/linux_ex/ch2$ rm python.log
itwill@ubuntu:~/linux_ex/ch2$ ls
a.log  b.log  passwd  test

itwill@ubuntu:~/linux_ex/ch2$ echo "test..." >> a.log
itwill@ubuntu:~/linux_ex/ch2$ echo "python..." >> b.log

itwill@ubuntu:~/linux_ex/ch2$ cat a.log
test...

itwill@ubuntu:~/linux_ex/ch2$ cat b.log
python...

itwill@ubuntu:~/linux_ex/ch2$ grep -l test *
a.log
grep: test: Is a directory

itwill@ubuntu:~/linux_ex/ch2$ grep -l python *
b.log
grep: test: Is a directory
itwill@ubuntu:~/linux_ex/ch2$ grep root passwd
root:x:0:0:root:/root:/bin/bash
nm-openvpn:x:984:984:NetworkManager OpenVPN:/var/lib/openvpn/chroot:/usr/sbin/nologin


itwill@ubuntu:~/linux_ex/ch2$ grep ^root passwd
root:x:0:0:root:/root:/bin/bash


itwill@ubuntu:~/linux_ex/ch2$ grep login$ passwd
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:998:998:systemd Network Management:/:/usr/sbin/nologin
messagebus:x:995:995:System Message Bus:/nonexistent:/usr/sbin/nologin
syslog:x:100:101::/nonexistent:/usr/sbin/nologin
systemd-resolve:x:989:989:systemd Resolver:/:/usr/sbin/nologin
_chrony:x:988:988:Chrony Daemon:/var/lib/chrony:/usr/sbin/nologin
tss:x:987:987:tss user for tpm2:/:/usr/sbin/nologin
uuidd:x:101:105::/run/uuidd:/usr/sbin/nologin
systemd-oom:x:986:986:systemd Userspace OOM Killer:/:/usr/sbin/nologin
dnsmasq:x:999:65534:dnsmasq:/var/lib/misc:/usr/sbin/nologin
avahi:x:103:109:Avahi mDNS daemon:/run/avahi-daemon:/usr/sbin/nologin
nm-openvpn:x:984:984:NetworkManager OpenVPN:/var/lib/openvpn/chroot:/usr/sbin/nologin
tcpdump:x:983:983:tcpdump:/nonexistent:/usr/sbin/nologin
sssd:x:104:110:SSSD system user:/var/lib/sss:/usr/sbin/nologin
usbmux:x:106:46:usbmux daemon:/var/lib/usbmux:/usr/sbin/nologin
cups-pk-helper:x:107:111:user for cups-pk-helper service:/nonexistent:/usr/sbin/nologin
fwupd-refresh:x:982:982:Firmware update daemon:/var/lib/fwupd:/usr/sbin/nologin
saned:x:108:112::/var/lib/saned:/usr/sbin/nologin
geoclue:x:109:113::/var/lib/geoclue:/usr/sbin/nologin
cups-browsed:x:110:111::/nonexistent:/usr/sbin/nologin
pipewire:x:981:981:system user for pipewire:/nonexistent:/usr/sbin/nologin
gnome-remote-desktop:x:980:980:GNOME Remote Desktop:/var/lib/gnome-remote-desktop:/usr/sbin/nologin
polkitd:x:979:979:User for polkitd:/:/usr/sbin/nologin
rtkit:x:978:978:RealtimeKit:/proc:/usr/sbin/nologin
colord:x:977:977:colord colour management daemon:/var/lib/colord:/usr/sbin/nologin
sshd:x:973:65534:sshd user:/run/sshd:/usr/sbin/nologin

 

itwill@ubuntu:~/linux_ex/ch2$ alias
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias c='clear'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

 

기본적으로 grep='grep --color=auto' 옵션이 alias로 설정되어 있어서 찾고자하는 단어가 색상으로 표시된다.

 

grep에서의 -i 옵션은 대소문자를 구분하지 않겠다는 뜻이다.

itwill@ubuntu:~/linux_ex/ch2$ grep -i ^root passwd
root:x:0:0:root:/root:/bin/bash
itwill@ubuntu:~/linux_ex/ch2$ echo "rooto:x:......" >> passwd
itwill@ubuntu:~/linux_ex/ch2$ echo "ROOT:x:......" >> passwd
itwill@ubuntu:~/linux_ex/ch2$ grep ^root passwd
root:x:0:0:root:/root:/bin/bash
rooto:x:......
itwill@ubuntu:~/linux_ex/ch2$ grep -w ^root passwd
root:x:0:0:root:/root:/bin/bash
itwill@ubuntu:~/linux_ex/ch2$

 

그러나 ^root를 사용하면 위와 같이 rooto까지 모두 검색에 걸리는 상황이 발생한다.

이럴 때에는 -w옵션을 사용해서 ^root와 정확하게 일치하는 문자열만 조회되게 할 수 있다.

 

itwill@ubuntu:~/linux_ex/ch2$ grep -wi ^root passwd
root:x:0:0:root:/root:/bin/bash
ROOT:x:......

 

-wi (정확하게 일치하며 대소문자를 구분하지 않음) 옵션을 사용하자 위와 같이 조회되었음을 확인할 수 있다.


07 wc - 글자 수 세기

 * 사용법

  wc [ 옵션 ] 파일명

 

 * 옵션

 - l : 라인수

 - w : 단어수

 - c : 글자수

 

ex) 

$ wc -l python.log

   13 python.log

$ cat python.log | wc -l

   13

itwill@ubuntu:~/linux_ex/ch2$ ls -l
total 16
-rw-rw-r-- 1 itwill itwill    8 Jul 15 15:25 a.log
-rw-rw-r-- 1 itwill itwill   10 Jul 15 15:26 b.log
-rw-r--r-- 1 itwill itwill 2856 Jul 15 14:41 passwd
drwxrwxr-x 3 itwill itwill 4096 Jul 15 12:38 test
itwill@ubuntu:~/linux_ex/ch2$ ls -l | grep *.log
itwill@ubuntu:~/linux_ex/ch2$ ls -l | grep log
-rw-rw-r-- 1 itwill itwill    8 Jul 15 15:25 a.log
-rw-rw-r-- 1 itwill itwill   10 Jul 15 15:26 b.log
itwill@ubuntu:~/linux_ex/ch2$ ls -l | grep log | wc
      2      18     102
itwill@ubuntu:~/linux_ex/ch2$ ls -l | grep log | wc -l
2

08 파이프

 이전 명령어의 결과를 다음 명령어의 입력값으로 넘겨서 처리한다.

 

ex)

$ cat python.log | wc -l

  13

$ ls -l | grep

* 다양한 파이프 실습

itwill@ubuntu:~/linux_ex/ch2$ cat -n python.log | tail -n +5
     5  python test...
     6  python test...
     7  python test...
     8  python test...
itwill@ubuntu:~/linux_ex/ch2$ ls -l
total 12
-rw-r--r-- 1 itwill itwill 2856 Jul 15 14:41 passwd
-rw-rw-r-- 1 itwill itwill   99 Jul 15 14:58 python.log
drwxrwxr-x 3 itwill itwill 4096 Jul 15 12:38 test
itwill@ubuntu:~/linux_ex/ch2$ ls -l | grep passwd
-rw-r--r-- 1 itwill itwill 2856 Jul 15 14:41 passwd
itwill@ubuntu:~/linux_ex/ch2$ ls -l | grep ^d
drwxrwxr-x 3 itwill itwill 4096 Jul 15 12:38 test
itwill@ubuntu:~/linux_ex/ch2$ ls -l | grep ^-
-rw-r--r-- 1 itwill itwill 2856 Jul 15 14:41 passwd
-rw-rw-r-- 1 itwill itwill   99 Jul 15 14:58 python.log
itwill@ubuntu:~/linux_ex/ch2$ cat -n passwd
     1  root:x:0:0:root:/root:/bin/bash
     2  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
     3  bin:x:2:2:bin:/bin:/usr/sbin/nologin
     4  sys:x:3:3:sys:/dev:/usr/sbin/nologin
     5  sync:x:4:65534:sync:/bin:/bin/sync
     6  games:x:5:60:games:/usr/games:/usr/sbin/nologin
     7  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
     8  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
     9  mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    10  news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
    11  uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
    12  proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
    13  www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
    14  backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
    15  list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
    16  irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
    17  _apt:x:42:65534::/nonexistent:/usr/sbin/nologin
    18  nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
    19  systemd-network:x:998:998:systemd Network Management:/:/usr/sbin/nologin
    20  dhcpcd:x:996:996:DHCP Client Daemon:/usr/lib/dhcpcd:/bin/false
    21  messagebus:x:995:995:System Message Bus:/nonexistent:/usr/sbin/nologin
    22  syslog:x:100:101::/nonexistent:/usr/sbin/nologin
    23  systemd-resolve:x:989:989:systemd Resolver:/:/usr/sbin/nologin
    24  _chrony:x:988:988:Chrony Daemon:/var/lib/chrony:/usr/sbin/nologin
    25  tss:x:987:987:tss user for tpm2:/:/usr/sbin/nologin
    26  uuidd:x:101:105::/run/uuidd:/usr/sbin/nologin
    27  systemd-oom:x:986:986:systemd Userspace OOM Killer:/:/usr/sbin/nologin
    28  whoopsie:x:102:108::/nonexistent:/bin/false
    29  dnsmasq:x:999:65534:dnsmasq:/var/lib/misc:/usr/sbin/nologin
    30  avahi:x:103:109:Avahi mDNS daemon:/run/avahi-daemon:/usr/sbin/nologin
    31  nm-openvpn:x:984:984:NetworkManager OpenVPN:/var/lib/openvpn/chroot:/usr/sbin/nologin
    32  tcpdump:x:983:983:tcpdump:/nonexistent:/usr/sbin/nologin
    33  sssd:x:104:110:SSSD system user:/var/lib/sss:/usr/sbin/nologin
    34  speech-dispatcher:x:105:29:Speech Dispatcher:/run/speech-dispatcher:/bin/false
    35  usbmux:x:106:46:usbmux daemon:/var/lib/usbmux:/usr/sbin/nologin
    36  cups-pk-helper:x:107:111:user for cups-pk-helper service:/nonexistent:/usr/sbin/nologin
    37  fwupd-refresh:x:982:982:Firmware update daemon:/var/lib/fwupd:/usr/sbin/nologin
    38  saned:x:108:112::/var/lib/saned:/usr/sbin/nologin
    39  geoclue:x:109:113::/var/lib/geoclue:/usr/sbin/nologin
    40  cups-browsed:x:110:111::/nonexistent:/usr/sbin/nologin
    41  pipewire:x:981:981:system user for pipewire:/nonexistent:/usr/sbin/nologin
    42  hplip:x:111:7:HPLIP system user:/run/hplip:/bin/false
    43  gnome-remote-desktop:x:980:980:GNOME Remote Desktop:/var/lib/gnome-remote-desktop:/usr/sbin/nologin
    44  polkitd:x:979:979:User for polkitd:/:/usr/sbin/nologin
    45  rtkit:x:978:978:RealtimeKit:/proc:/usr/sbin/nologin
    46  colord:x:977:977:colord colour management daemon:/var/lib/colord:/usr/sbin/nologin
    47  gdm:x:975:975:Gnome Display Manager:/var/lib/gdm3:/bin/false
    48  itwill:x:1000:1000:itwill:/home/itwill:/bin/bash
    49  sshd:x:973:65534:sshd user:/run/sshd:/usr/sbin/nologin
    50  rooto:x:......
    51  ROOT:x:......
itwill@ubuntu:~/linux_ex/ch2$ cat -n passwd | grep -w root
     1  root:x:0:0:root:/root:/bin/bash

 

* 줄 번호, 단어 수, 글자수 조회

itwill@ubuntu:~/linux_ex/ch2$ wc python.log
 8 13 99 python.log
itwill@ubuntu:~/linux_ex/ch2$ wx -l python.log
wx: command not found
itwill@ubuntu:~/linux_ex/ch2$ wc -w python.log
13 python.log
itwill@ubuntu:~/linux_ex/ch2$ wc -c python.log
99 python.log

 

먼저 cat으로 연 뒤 | wc -l을 통해 파일명을 제외하고 원하는 숫자만 추출할 수도 있다.

itwill@ubuntu:~/linux_ex/ch2$ wc python.log
 8 13 99 python.log
itwill@ubuntu:~/linux_ex/ch2$ wc -l python.log
8 python.log
itwill@ubuntu:~/linux_ex/ch2$ wc -w python.log
13 python.log
itwill@ubuntu:~/linux_ex/ch2$ wc -c python.log
99 python.log
itwill@ubuntu:~/linux_ex/ch2$ cat python.log | wc -l
8

09 쉘 사용하기

 쉘은 명령어 해석기 기능, 프로그래밍 기능, 사용자 환경 설정 기능을 수행한다.

 

 python, SQL, R 등은 데이터를 조회하고 처리하기 위한 언어이며, 쉘은 OS에 관련되어 있기 때문에 컴퓨터의 모든 기능을 통제/제어하기 위한 언어이다.

 즉, 사용자의 환경설정, 하드웨어 및 소프트웨어 등의 제어를 위한 것이 쉘의 주기능이다.

 쉘은 본쉘, C쉘, 콘 쉘, 배시 쉘, 대시 쉘 등이 있다.

 현업에서는 유닉스 환경이라면 콘 쉘(KSH), 리눅스 환경이랑 본 쉘 (유닉스 환경이어도 사용하기도 한다)을 사용한다.

 

itwill@ubuntu:~/linux_ex/ch2$ grep itwill /etc/passwd
itwill:x:1000:1000:itwill:/home/itwill:/bin/bash

 

 우분투는 기본적으로 배시 셸이나, 강의에서 본 셸 사용을 위해 itwill@ubuntu:~/linux_ex/ch2$ vi test.sh 로 새로운 파일을 생성한다.

 #! /bin/sh 로 본 셸로 작성한다고 선언한다.

:w로 빠져나오고 창을 하나 더 열어준다.

 

itwill@ubuntu:~/linux_ex/ch2$ ls
a.log  b.log  passwd  test  test.sh
itwill@ubuntu:~/linux_ex/ch2$ sh test.sh
디렉토리 이름을 입력하세요 : /home/itwill/linux_ex
디렉토리로 이동하겠습니다

\c가 커서 위치를 고정해주는 옵션이다. (bash셸에서는 되지 않는다. 본셸에서만 된다.)

: 옆에 입력 커서가 깜빡이는 것이 좋기 때문이다.

만약 입력하세요 : 아래에서 디렉토리 이름을 입력하고 싶다면  \c를 아래에 써주면 된다.

 

# 변수 선언 / 호출

 1) 변수 선언 : 공백없이 변수명 = 값 형태로 실행

a1="문자열..."  (띄어쓰기를 하지 않아야 한다.)

 

 2) 변수 호출 : $와 함께 호출

$a1

 

 3) 명령어 결과를 변수에 저장하기

변수명=$(명령어)

변수명=`명령어` (역따옴표! 물결 아래 있다.)

itwill@ubuntu:~/linux_ex/ch2$ a1
a1: command not found
itwill@ubuntu:~/linux_ex/ch2$ $a1
test...: command not found
itwill@ubuntu:~/linux_ex/ch2$ echo $a1
test...

 

a1을 입력한 경우 -> a1이라는 커맨드를 입력했다고 인지한다.

$a1을 입력한 경우 -> $a1을 실행, test...라는 커맨드를 입력했다고 인지한다.

echo $a1 -> a1을 실행, 해당 내용을 출력한다.

 

itwill@ubuntu:~/linux_ex/ch2$ sh test.sh
디렉토리 이름을 입력하세요 : /home/itwill/linux_ex
dir 디렉토리로 이동하겠습니다
/home/itwill/linux_ex

 

itwill@ubuntu:~/linux_ex/ch2$ sh test.sh
디렉토리 이름을 입력하세요 : /home/itwill/linux_ex/ch2
/home/itwill/linux_ex/ch2 디렉토리로 이동하겠습니다
/home/itwill/linux_ex/ch2
4

 

itwill@ubuntu:~/linux_ex/ch2$ sh test.sh
디렉토리 이름을 입력하세요 : /home/itwill/linux_ex/ch2
/home/itwill/linux_ex/ch2 디렉토리로 이동하겠습니다
/home/itwill/linux_ex/ch2
해당 디렉토리 하위 파일 수 : 4

 

 정상적으로 작동함을 확인할 수 있다.