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
정상적으로 작동함을 확인할 수 있다.
'아이티윌_데이터 분석 55기 > 강의내용_Linux' 카테고리의 다른 글
| #6 6일차_파이썬 스크립트 실행, 로깅 처리, 정렬, 특수기호 정의 (1) | 2026.07.22 |
|---|---|
| #5 5일차_반복문, 산술연산, 색 변수 설정, 지역변수/전역변수, 아나콘다 설치 (0) | 2026.07.21 |
| #4 4일차_서버 이식, if/case, windcp, 유저생성/소유자 변경, find, 리다이렉션, crontab (0) | 2026.07.20 |
| #3 환경설정 및 변수선언, 권한설정, 조건문 (0) | 2026.07.16 |
| #1 1일차_Linux 설치 (0) | 2026.07.14 |