728x90
반응형
SMALL

Vim(Vi Improved)는 텍스트 기반의 아주 아주 유명한 에디터인데, 은근 많이 사용되고 꽤나 유용하기 때문에 알아두면 좋을 것 같다. 근데 아무리 알아둔다고 해도 안 쓰고 시간이 지나면 자꾸 까먹어 가지고 정리를 하고자 한다.

SMALL

 

설정 파일 (없으면 만들면 된다)

~/.vimrc

 

컬러 스키마나 플러그인 관련 데이터 파일 경로

~/.vim/autoload ~/.vim/backup ~/.vim/colors ~/.vim/plugged
$ cd ~/.vim/colors

$ curl -o molokai.vim https://raw.githubusercontent.com/tomasr/molokai/master/colors/molokai.vim

 

 

우선 Vim은 여러 모드(Mode)가 있다. 이 여러가지 모드들부터 살펴보자.

Vim 여러 가지 모드

Mode Description
Normal Mode Vim 시작 시 모드
Insert Mode i, a, o 등의 명령어로 삽입 모드 진입 (쓰기 모드)
Visual Mode visual line/block 을 지정해서 동작하는 모드
Select Mode 선택 영역을 바로 수정 (거의 쓰이지 않음)
Command-line Mode ':', '/', '?', '!' 으로 명령 수행
Ex Mode Ex mode(Ex라는 툴의 기능을 말하는데 요즘은 거의 쓰이지 않음)
Terminal-job Mode :terminal 명령으로 vim 창에서 터미널 실행(예: bash)

 

여러 모드의 대표적인 예시를 하나씩 알아보자면 (이후에 더 자세히 알아볼거다) 우선, Normal Mode를 보자.

Normal Mode는 VI로 파일을 최초로 열었을 때의 모드이다. 다른 말로 아무런 모드도 아닌 모드이다.

 

Insert Mode는 이제 쓰기 모드가 된다. 입력, 수정, 삭제가 가능해지는 모드가 된다.

이 Insert Mode로 들어가려면 Normal Mode에서 'i'를 입력하면 하단에 --INSERT-- 라는 표시가 띄워진다. 이 상태가 Insert Mode이다. 다음 사진처럼 말이다.

 

Visual Mode는 Block을 지정해서 수정할 수 있는 모드라고 기억하면 좋을 것 같다. 예를 들어 여러 문장을 한번에 지우고 싶을 때 일반적으로 그 전체 라인을 마우스로 드래그&드랍을 하면 블록으로 포커싱이 되고 지울 수 있는 것처럼. 이 Visual Mode로 들어가려면 Normal Mode에서 'v'를 누르면 하단에 --VISUAL-- 이라고 표시가 된다. 이 때가 Visual Mode이다.

 

위 사진처럼 VISUAL 모드일 때 화살표로 위아래로 움직이면 블록으로 포커싱이 되는데, 이 블록으로 포커싱 됐을 때 만약 저 블록만큼 날리고 싶으면 'x'를 누르면 날라간다. 그리고 행한 작업에 대해 다시 돌리고 싶으면(Undo) 'u'를 누르면 다시 복원된다.

 

이제 Command-line Mode인데 이건 리눅스에서 여러 명령어를 사용하는 것처럼 이 Vim 에서도 사용할 수 있다. 예를 들면, 특정 키워드를 찾고 싶으면 /키워드 를 입력 후 엔터를 치면 그 키워드가 있는 경우 그 곳으로 포커싱된다. 다음 사진처럼 말이다.

 

 

이동

Vim 에디터에서 커서 이동화면 이동에 대한 내용이 있는데, 이 이동에 대한 단축키를 알면 꽤나 유용하다. 화살표보다 훨씬 유용하다.

여러 단축키가 있는데 내가 자주 사용하고 유용하다 생각하는 것만 정리하겠다.

 

커서 이동

Key Description
0 라인 시작으로 이동
f + '찾고자 하는 단어' (예: f + p, f + i, f + 3,...) 현재 라인에서 커서 기준 뒤쪽에 제일 가까이에 있는 '찾고자 하는 단어'로 커서 이동
F + '찾고자 하는 단어' 현재 라인에서 커서 기준 앞쪽에 제일 가까이에 있는 '찾고자 하는 단어'로 커서 이동
$ 라인 끝으로 이동
G 파일의 마지막 줄로 이동
gg 파일의 첫 줄로 이동
:라인넘버 입력한 라인넘버로 이동(예: ":55 + Enter" 하면 55번 라인으로)
/searchTerm 입력한 단어를 찾아준다. (예: "/provider" 입력하고 Enter하면 해당 단어가 있으면 찾아준다. 여러개 있는경우 n: Next N: Previous)

 

화면 이동

Key Description
ctrl + f 한 페이지 앞으로
ctrl + b 한 페이지 뒤로
ctrl + e 화면 한 줄씩 앞으로
ctrl + y 화면 한 줄씩 뒤로

 

Copy, Paste, Delete

Normal Mode에서

Key Description
dd 현재 커서의 문장 지우기
yy 현재 커서의 문장 복사
p or P P: 커서 앞에 붙여넣기
p: 커서 뒤에 붙여넣기

 

멀티 윈도우

Key Description
vim -O test.sh test2.sh Vim 실행 시 창 분할 (세로)
⌃+w v Vim 실행 후 창 분할 (세로)
⌃+w w 다음 창으로 커서 이동

 

728x90
반응형
LIST

'Linux' 카테고리의 다른 글

Hard Link / Soft Link  (0) 2023.10.04
사용자와 그룹과 파일 권한  (0) 2023.10.04
Linux란 ?  (0) 2023.10.04
[Linux]: 내가 쓰려고 기록한 유용한 Commands  (2) 2023.10.04
728x90
반응형
SMALL
반응형
SMALL

Hard Link와 Soft Link 둘 다 어떤 파일(폴더)에 대한 링크을 만드는데 사용된다.

Soft Link는 다른 말로 symbolic link 또는 symlink 라고도 한다. 

Hard Link와 Soft Link 그 차이를 이해하기 전에 아이노드라는 개념을 알아야한다.

 

inode

위 그림을 살펴보자.

파일의 구조라는게 파일의 이름을 나타내는 부분과 그 옆에 아이노드의 주소를 가리키는 부분이 있다. 그림에서 Directory Entry라고 표시된 부분이 해당 부분이다. 여기서 아이노드의 주소가 아이노드를 가리키는데 아이노드는 해당 파일과 그 파일이 가지고 있는 데이터를 연결하고 있다. 그래서 사실 파일의 데이터는 그 파일이 온전히 가지고 있는게 아니고 아이노드라는 녀석이 해당 데이터의 주소를 가지고 있게 되고 그 주소를 따라가면 실제 그 파일의 데이터를 나타내는 부분이 있게 된다. 이것을 아이노드라고 한다.

 

 

Hard Link / Soft Link

하드 링크와 소프트 링크는 아래 그림을 보면 쉽게 이해가 된다.

소프트 링크는 내가 어떤 특정 파일을 링크할 때 링크하고 있는 데이터가 원본을 가리키게 된다 (오른쪽 Link Data가 원본 파일을 가리키고 있음). 소프트 링크로 링크를 만들면 그 파일 역시 아이노드를 가진다 (우측 심볼릭 링크가 자기만의 아이노드를 가지고 있음).

 

반면, 하드 링크는 원본의 아이노드를 공유하는 구조이다(왼쪽 같은 아이노드를 하드링크와 원본이 가리키고 있음). 그래서 하드 링크는 같은 아이노드를 가리키는 여러개의 하드 링크로 만들어질 수 있고 이 때 아이노드는 무조건 원본 아이노드 딱 하나다.

 

소프트 링크 다른 말로 심볼릭 링크가 많이 쓰이는 방법이다. 소프트 링크를 사용하면 웬만하면 절대 경로로 링크를 걸어주는 게 좋다. 왜냐하면, 상대 경로로 만들어주면 파일을 옮겼을 때 링크가 깨지기 때문. 하드 링크는 그럴 필요가 없다. 왜냐하면 하드 링크는 아이노드를 아예 공유하기 때문이다.

728x90
반응형
LIST

'Linux' 카테고리의 다른 글

Vim 필수 기능 정리  (0) 2023.12.27
사용자와 그룹과 파일 권한  (0) 2023.10.04
Linux란 ?  (0) 2023.10.04
[Linux]: 내가 쓰려고 기록한 유용한 Commands  (2) 2023.10.04
728x90
반응형
SMALL
반응형
SMALL

root / group / user

리눅스라는 운영체제는 여러 사용자가 같이 사용할 수가 있는데 그 사용자들 중 최상위 권한을 가지는 root 계정이 있고 root 계정은 리눅스라는 운영체제를 설치하는 순간부터 바로 만들어지는 계정이다. 그 외 별도로 사용자를 또는 그룹을 생성하여 만들 수 있다.

 

그리고 이 root, group, user단위로 행위에 대한 제약 조건이 생긴다. 그래서 사용자와 그룹에 대한 지식이 필요하다.

 

 

파일 소유권

각 파일(폴더)은 소유권과 권한이란게 존재한다. 명령어 ls -al을 입력해보면 아래와 같이 노출되는 걸 볼 수 있다.

위 사진에서 빨간 박스의 첫 번째가 해당 파일에 Owner가 누구인지 나타내는 부분이다.

그리고 두 번째Group에 대한 설명이다. 즉, 이 파일에 권한을 가지는 그룹이 누구냐를 의미한다.

위 사진을 예로 보면 그룹 부분이 다 root이므로 이 파일 소유권권한 모두 root계정만 가진다고 보면 된다.

 

권한은 좀 더 세부적으로 파고들어갈 수 있는데 맨 왼쪽에 보면 권한에 대한 표시가 나타나 있다. 

.java 폴더의 맨 앞을 보면 drwxr-x--- 로 표현되어 있음을 확인할 수 있는데 이게 의미하는 건 이 파일은 디렉터리 형태이고, Owner는 read, write, execute가 가능하며, Group은 read, execute가 가능하며, Other users는 그 무엇도 하지 못함을 의미한다.

 

이 내용은 다음 섹션인 파일 권한에서 좀 더 자세히 알아보자. 

 

 

파일 권한 (8진 표기법) 

 

8진법은 모든 숫자를 8개의 숫자 (0 - 7)로만 표현하는 방식이다.

그래서 8진법을 2진법으로 나타내는 방법은 3개의 digit으로 표현한다. 왜냐하면 앞에서부터 2의 2승, 2의 1승, 2의 0승을 하면 합이 7이 되니까. 더 쉽게 말해 세개의 digit으로 8진법을 모두 표현 가능하기 때문에 8진법을 2진법으로 나타내는 방법은 3개의 digit으로 표현한다.

 

그럼 이제서야 777의 의미가 이해가 된다. 777은 Owner, Group, Other users 모두 read, write, execute 권한을 다 부여하는 것.

그럼 754는 ? Owner는 모든 권한을, Group은 read와 execute, Other users는 read권한을 부여한다는 의미가 된다.

그리고 맨 앞 -는 파일을 d는 폴더를 의미한다.

 

그래서 다시 저 위로 올라가보면 .java라는 폴더의 파일 권한은 drwxr-x--- 이렇게 표기되어 있는데 이 의미는 폴더이며 Owner에게 read, write, execute 권한이 있고 Group에게는 read, execute 권한이 있고 Other users는 아무런 권한도 가지고 있지 않음을 알 수 있다.

 

 

파일 권한 (의미 표기법)

의미 표기법은 이제 8진법으로 표현하는 방식이 human-friendly하지 않기 때문에 그걸 좀 인간이 이해하기 쉽게 만든 방식이라고 보면 된다.

명령어는 다음과 같이 사용할 수 있다.

chmod [ugoa(+/-)rwx] <dir>

u: user

g: group

o: others

a: all

+: add permission

-: remove

 

예를 들어 chmod go+rx <dir> 이렇게 입력하면, group과 others에 read와 execute 권한을 <dir>에 부여하겠다는 의미가 된다.

728x90
반응형
LIST

'Linux' 카테고리의 다른 글

Vim 필수 기능 정리  (0) 2023.12.27
Hard Link / Soft Link  (0) 2023.10.04
Linux란 ?  (0) 2023.10.04
[Linux]: 내가 쓰려고 기록한 유용한 Commands  (2) 2023.10.04
728x90
반응형
SMALL
반응형
SMALL

Linux?

Linux는 OS다. OS는 Operation System의 약자로 운영체제라고 불리고, 운영체제란 컴퓨터의 하드웨어와 소프트웨어 자원을 관리하는 시스템 소프트웨어를 말한다.

 

Linux에는 여러 배포판이 존재하는데 그중 흔히 사용되는 건 CentOS, Ubuntu, Fedora 등이 있다. 여러 배포판이 존재한다는 것은 배포판끼리 차이점도 존재한다는 뜻이지만 모든 배포판 사이에서도 공통점이 존재하는데 이는 리눅스 커널(Kernel)을 사용한다는 것이다.

 

Linux Kernel?

리눅스 커널은 리눅스 운영체제에서 가장 중요한 구성요소라고 할 수 있다. 그리고 컴퓨터의 하드웨어들과 프로세스들의 핵심이 되는 인터페이스 역할을 한다. 그래서 커널이 도대체 무엇을 하는 걸까? 

 

- 메모리 관리: 어디에 그리고 무엇에 메모리가 사용되고 저장되는지를 지속적으로 추적한다.

- 프로세스 관리: 어떤 프로세스가 언제, 어떻게, 그리고 얼마나 오래 CPU를 사용할 수 있는지 결정한다.

- 디바이스 드라이버: 하드웨어와 프로세스 간 중재자 역할을 한다.

- 시스템 요청과 보안: 프로세스로부터 서비스에 대한 요청에 대한 책임이 있고 보안에 대한 책임을 가진다.

 

Linux 운영 체제 주요 구성요소

  • 커널 (kernel) - 운영체제와 거의 비슷하게 아래 내용들을 다 도와주는 소프트웨어라고 생각하면 된다.
  • 프로그램 실행과 멀티 테스킹
  • 인터럽트 - 하드웨어가 운영체제한테 뭔가 데이터가 전달되었다는 걸 알려주는 것
  • 메모리 관리
  • 파일 시스템
  • 디바이스 드라이버 - 각각의 디바이스(GPU, CPU,...)를 잘 동작시키기 위해 필요한 것
  • 네트워킹
  • 사용자 인터페이스

 

관련 알고 있으면 좋을 지식들

- 리눅스에서는 파일 확장자라는 개념이 따로 없다: 그냥 파일 확장자를 붙일 수는 있다만, 파일 확장자를 가지고 동작하지 않는다.

- exit 명령어는 터미널을 종료하는 게 아니고 쉘(shell)을 종료하는 것이다

- env 명령어를 실행하면 PC에 세팅된 모든 환경변수를 확인할 수 있다

- 리눅스는 설치하는 순간 무조건 root 계정이 자동으로 생성된다

- 리눅스는 기본적으로 /home 다음 계정 별 폴더가 존재하게 된다: 즉, 리눅스에 test, app, cwchoi라는 계정이 있으면 /home 아래에 test, app, cwchoi라는 폴더가 있다. 참고로 맥은 /Users 아래에 존재한다.

- Ubuntu는 apt가 패키지 매니저 CentOS는 yum이 패키지 매니저다

- ls -ali를 입력하면 아이노드 번호와 하드링크된 개수를 확인할 수 있다: 아래는 해당 명령어를 입력했을 때 노출되는 화면이다. 맨 앞에 칼럼이 아이노드 번호다. 그리고 세 번째 칼럼이 링크된 개수를 의미한다. 4로 표시되면 해당 폴더가 하드링크된 개수가 4개임을 의미한다.

 

 

File System

파일을 관리하기 위한 시스템이다. OS와 File사이 어딘가에 존재하는 녀석이다. 파일이 파일 시스템에 올라가는 것을 "마운트 된다"라고 표현한다. 만약, 추가적인 하드 디스크를 구비해서 장착하면 이 하드디스크를 나타내는 파일이 파일 시스템에 마운트 되어야 한다. 그래야 그 하드 디스크를 파일 시스템에서 사용할 수 있게 된다. 

리눅스는 Tree 형태의 계층 구조를 가지는데 그 구조의 가장 최상위는 root(/)이다.

위 사진처럼 트리구조를 가지면서 파일을 형성하는데 파일의 종류는 다음과 같다.

 

- 일반 파일 (regular file): 말 그대로 일반 파일이다. 텍스트 파일, 동영상 파일 등이 일반 파일에 포함된다.

- 디렉터리 (directory): 디렉터리도 파일의 한 종류이다.

- 심볼릭 링크 파일 (symbolic link file): 어떤 다른 파일을 가리키는 파일이다.

- 블록 디바이스 파일 / 문자 디바이스 파일 (block/character device file): 블록 또는 문자 디바이스를 제어하기 위한 파일. 디바이스 파일이란 일단 컴퓨터 구조가 HW - OS - App 이런 식으로 생겨먹었는데 HW와 OS 간 커뮤니케이션을 위해선 그 역할을 수행하는 녀석이 필요하고 그게 디바이스 드라이버다. 디바이스 드라이버를 통해 OS가 HW에게 명령을 내리거나 어떤 신호를 받는데 이건 이제 OS와 HW 간 의사소통이고 OS위에 올라가 있는 Application에서 또한 HW와 의사소통을 할 수가 있다. 이때 필요한 것이 디바이스 파일이다.

- 파이프 파일 (pipe file): 파이프를 나타내는 파일이다. 프로세스 간 통신에 사용된다.

- 소켓 (socket): 소켓을 나타내는 파일이다. 프로세스 간 통신에 사용된다.

 

위 이미지에서 각 파일 별 이미 역할을 가지고 있는, 좀 더 와닿는 표현으로는 관습적으로 그렇게 행하고 있는 폴더가 있다. 아래 내용을 보자.

  • / : 루트 디렉터리. 모든 디렉터리의 최상위 부모
  • /bin : 모든 사용자가 사용할 수 있는 여러 가지 실행 파일이 위치
  • /sbin : 시스템 관리자 권한으로 실행해야 하는 실행 파일이 위치
  • /etc : 여러 가지 설정 파일 (주의요망)
  • /lib : 공유 라이브러리 디렉터리
  • /home : 사용자들의 홈 디렉터리. 이 디렉터리 아래에는 각 계정 별 폴더가 존재하게 된다.
  • /mnt : 일시적으로 파일 시스템에 마운트 하는 경우 사용하는 디렉터리. 예를 들어 USB, CD ROM과 같은 일시적인 공간을 마운트 할 때 관습적으로 이 부분을 위치하게 된다.
  • /proc, /sys : 시스템 정보를 설정/조회할 수 있는 디렉터리. 이 녀석들은 특수한 디렉터리인데 운영체제가 자신의 정보들을 사용자(유저 레벨의 애플리케이션)에게 보여주기 위해 만들어진 파일이고 HW에 실제 존재하는 공간이 아니라 OS가 만들어낸 가상의 파일
  • /tmp : 임시 디렉터리
  • /usr : 사용자가 추가한 실행 파일, 라이브러리 등의 소프트웨어 저장.
  • /dev : 디바이스 드라이버가 사용하는 디바이스 파일 디렉터리.
728x90
반응형
LIST

'Linux' 카테고리의 다른 글

Vim 필수 기능 정리  (0) 2023.12.27
Hard Link / Soft Link  (0) 2023.10.04
사용자와 그룹과 파일 권한  (0) 2023.10.04
[Linux]: 내가 쓰려고 기록한 유용한 Commands  (2) 2023.10.04
728x90
반응형
SMALL
반응형
  • man: manual의 약자, 특정 커맨드가 어떤 커맨드인지 알려주는 명령어 (예: man ls) man을 사용해서 특정 커맨드가 무엇을 하는지 알려주는 man page가 노출될 때 / 입력 후 원하는 검색어를 입력하고 엔터를 치면 해당 키워드를 찾아준다. 그리고 그다음 키워드를 찾을 때는 / 입력 후 엔터를 치면 그다음으로 넘어감
SMALL

  • cat /etc/os-release: OS 버전 확인

  • find <path> -mtime +3 -exec rm {} \; : 3일 지난 파일 삭제 

  • find /tmp -size 0 -print -delete: /tmp 경로의 size 0인 파일에 대해 프린트 및 삭제

  • curl ifconfig.co: Public IP 확인

  • su <username>: 유저 변경

  • echo: 터미널에서 echo 다음 인자로 입력한 내용을 출력하는 명령어 (예: echo $$) 입력하면 터미널에 현재 프로세스 ID 출력 $$는 현재 프로세스 ID를 담고 있는 변수

  • passwd: 유저의 비밀번호 변경

  • which <execute file>: 실행 파일의 위치를 찾아준다.

  • find [path...] -name <filename>: filename으로 입력한 파일이 어디 있는지 찾아주는 명령어. (예: find . -name "filename") 이렇게 실행하면 현재 디렉터리(.)부터 하위 디렉터리 전부에서 filename으로 된 파일을 모두 찾는다. [path...]이 의미하는 건 대괄호는 있어도 되고 없어도 되는 Optional을 의미하고 ...은 복수가 가능하다는 뜻. 나는 보통은 path를 생략해서 다음과 같이 사용한다. 
find | grep "conf"

  • find <-exec/-ok>: find로 찾아낸 파일(폴더)에 대해 어떤 행위를 수행하도록 하는 명령어. 예를 들어 보자. 
find . -name "*.py" -exec stat {} \;

이렇게 입력하면 .py로 끝나는 모든 파일을 현재 디렉터리부터 하위 모든 디렉터리에서 다 찾아서 각 파일마다 stat을 실행하겠다는 의미이다. 근데 exec는 대상이 필요하고 그 대상을 변수로 표현하는 방식이 {}다. 그리고 exec는 항상 마지막에 \;로 끝내야 한다. 만약 행위에 대해 사용자의 허가가 필요한 경우 ok를 exec 대신 사용하면 된다. 그러면 행위에 대해 사용자의 허가를 물어본다. 

find . -name “*.py” -ok rm -rf {} \;


  • systemctl [start|stop] <execute file>: execute file을 시작 또는 중지 (예: systemctl start jenkins)

  • lsof -t -i :<port>: 특정 Port를 사용 중인 프로세스의 ID를 리턴.

  • kill <process id>: process를 종료 kill -l을 입력해 보면 어떤 시그널을 주면서 프로세스를 죽이는지 확인할 수 있다. 그중 대표적인 게 9번인데 9번은 SIGKILL이다. SIGKILL은 온 세상이 무너져도 프로세스를 죽이겠다는 시그널이다. (예: kill -9 15221)

  • hostname -I: private IP를 리턴

  • cd -: 바로 직전 경로로 이동

  • cat, head, tail: cat은 전체를 head는 앞부분부터 10줄, tail은 밑에서 10줄을 출력. (예: cat /etc/passwd)
    10줄이 아니고 싶을 때 -n 옵션을 부여해서 원하는 만큼의 길이를 전달할 수 있다. (예: head -n 30 /etc/passwd) 여기서 이런식으로도 사용이 가능한데 head -n -10 /etc/passwd 이는 무엇을 말하냐면 앞부분을 출력하는데 뒤에서 10줄을 빼고 앞부분 모두를 출력하라는 의미가 된다. tail /etc/passwd -n +5 이렇게도 사용할 수 있다. 이는 위에서 5줄을 빼고 맨 밑까지 출력하는 명령어. tail은 밑에서부터 출력하니까 위에 부분을 자르기 때문에 + 기호를 사용하고 head는 위에서부터 출력하니까 아래 부분을 자르기 때문에 - 기호를 사용한다. 또 하나 tail에서 중요한 옵션이 있는데 --follow인데 이 옵션을 사용하면 해당 파일의 새로 작성되는 내용을 대기했다가 작성되는 내용을 바로바로 출력해 준다. tail /etc/passwd --follow 이런식으로 사용할 수 있다. 또한 tail은 -F라는 옵션이 있는데 이는 리눅스 로그 파일 같은 경우에 파일이 너무 커지면 시스템에서 알아서 파일의 backup 파일을 만들어주고 새로운 파일을 만들어서 그 파일에 추가적으로 로그를 생성해 주는데 이때, -F 옵션이 새로 만들어지는 파일로 reopen 해서 계속 follow 해주는 옵션이다. 

  • grep: 특정 내용으로 필터링하는 명령어. 예를 들어, tail dpkg.log | grep -i "unpacked"이라고 입력하면 tail dpkg.log를 실행한 출력값에서 unpacked이라는 문자를 담고 있는 라인만을 다 찾아준다. -i 옵션은 대소문자 구분을 하지 않는다는 것을 의미. 이렇게 "|"를 파이프라고 하는데 앞에 입력한 커맨드의 출력을 뒤에 커맨드의 입력으로 넣어주는 방법이다. grep만을 사용할 땐 grep start dpkg.log 이렇게 사용할 수 있고 이 커맨드는 dpkg.log 파일에서 start라는 문자열을 가진 라인을 다 찾아준다. grep을 사용할 때 문자열을 큰 따옴표(")로 묶기도 하고 묶지 않기도 하는데 이 큰 따옴표는 상당히 중요하다. 예를 들어, 내가 "startup packages configure"라는 문자열을 가진 라인만을 출력하고 싶어 grep startup packages configure dpkg.log라고 입력한다면 이 커맨드는 의도대로 동작하지 않고 startup이라는 문자열을 가진 라인을 packages, configure, dpkg.log 파일 각각에서 다 찾아서 출력하게 된다. 그래서 문자열 내 띄어쓰기가 있는 경우 반드시 큰 따옴표(")로 묶어줘야 한다. 

  • >: 출력 리디렉션이라는 명칭을 사용하는데 즉, 커맨드를 실행해서 출력된 출력값을 다른 곳(파일)으로 보낸다는 뜻. 예를 들어,
    ls > ls.log 이런 커맨드를 입력하면 ls 커맨드를 실행해서 나온 출력값을 ls.log라는 파일에 입력 후 저장하라는 의미가 된다. ls > ls.log라는 명령어는 사실 ls 1> ls.log 와 같은 명령어인데 1이 의미하는 건 표준 출력이다. 표준 스트림에서 0은 표준 입력, 1은 표준 출력, 2는 표준 에러를 의미하는데 당연하게도 출력값을 저장한다면 출력값 중 표준 출력을 말하는지 표준 에러를 말하는지 명시적으로 지정해줘야 한다. 그래서 생략했을 시에는 표준 출력을 저장하겠다는 의미가 된다. 그래서 만약 표준 에러를 넣고 싶다면 ls 2> ls.log를 사용하면 된다. 그리고 한가지 더, 대상 파일이 이미 존재하는 경우 덮어쓰기를 시도하는데 noclobber 옵션을 설정했으면 덮어쓰기 시도 시 에러가 발생한다. 이 에러를 무시하고 덮어쓰기에 성공하게 하려면 >| 이렇게 입력하면 된다. ls >| ls.log 이렇게 입력하면 noclobber 옵션 여부와 상관없이 덮어쓰기에 성공한다. 

  • >>: 추가모드 출력 리디렉션이라고 하는데 즉, 파일 끝에 추가로 붙여 넣는다는 명령어. 예를 들어 ls >> ls.log 라고 입력하면 ls.log라는 파일에 ls를 실행해서 출력된 출력값이 해당 파일의 마지막에 붙여 넣기가 된다. 파일이 없는 경우 파일을 만들어서 첫 줄에 넣는다. >와 마찬가지로 1 이라는 숫자가 생략된 것.

  • >& / &>: >&는 파일 디스크립터로 출력 리디렉션을 하는 명령어이고 &>는 표준 출력이든 표준 에러든 모두 파일에 덮어쓰기 하는 명령어. 그러니까 >& 이게 왜 나왔냐 ? 만약 내가 ls > result를 입력하면 표준 출력값을 result라는 파일에 덮어쓰겠다는 뜻인데 만약 이게 에러를 줄지 정상 출력값을 줄지 모르는데 나는 둘 중 어떤 게 나와도 result라는 파일에 덮어쓰고 싶을 때 이렇게 사용할 수 있다. ls > result 2>&1 의미는 일단 1번인 표준 출력값을 result에 덮어쓴다는 뜻인데 만약 2번인 표준 에러가 나오면 그걸 1번 표준 출력인 파일 디스크립터에 리디렉션하겠다는 의미다. 그래서 결국 표준 에러값이 표준 출력값에 리디렉션 되어 result파일에 표준 출력이든 표준 에러든 들어갈 수 있다. 근데 이게 귀찮으니까 이를 대체하고자 만들어진 명령어가 &>다. 그래서 ls &> resultls > result 2>&1와 완벽하게 동일하다. 

  • <: 입력 리디렉션이라는 명칭을 사용하고 파일의 내용을 표준 입력으로 가져다가 쓰겠다는 명령어. 예를 들어, 사용자로부터 표준 입력 스트림을 받는 어떤 애플리케이션이 있다면 그 애플리케이션에게 파일 내용을 입력값으로 주겠다는 것. 좀 더 자세하게 설명하자면 "wc"라는 리눅스가 기본으로 제공하는 커맨드가 있는데 이 커맨드는 사용자한테 표준 입력을 받는 프로세스이다. 그래서 wc < ls.log 이렇게 입력하면 ls.log라는 파일의 내용을 wc를 실행했을 때 표준 입력으로 주겠다는 뜻이 된다. 이 또한 0이라는 숫자 (표준 입력)가 생략된 것. 즉 wc 0< ls.logws < ls.log와 동일하다.

  • <<: 사용자가 직접 입력해서 표준 입력값을 주는 명령어. 예를 들어 wc << EOF라고 입력하면 뭔가를 계속 입력할 수 있게 되는데 입력하고자 하는 모든 내용을 입력하고 마지막에 EOF를 입력하면 첫 EOF와 마지막 EOF사이에 모든 입력값을 wc에게 표준 입력으로 준다. EOF라는 단어는 정해진 게 아니고 어떤 단어든 상관없다. 그저 구분자 역할을 하는 단어.

  • <<<: 이건 작성할까 말까 고민을 했는데 그냥 <<의 한 줄 버전이라고 생각하면 된다. 딱 한 줄만 표준 입력으로 들어간다. 예를 들면, wc <<< "입력할 단어"

  • gzip / gunzip: 일반적으로 개별 파일들을 gzip으로 압축. 개별 파일이란, 한 개의 파일을 말한다. 파일 여러개 (2개, 3개, 4개,...)를 묶을 땐 tar.gz를 많이 사용한다는데 이유는 나도 모르겠다. 관습인가 보다. gzip은 파일을 압축하는 거고 gunzip은 압축을 해제한다.

  • file: 특정 파일의 정보를 알려준다. 예를 들어, file ls.log 이렇게 실행하면 ls.log 파일 정보를 알려준다.

  • tar: 위 gzip 커맨드에서 개별 파일을 압축할 땐 .gz로 하고 파일 여러 개는 tar.gz로 한다고 했는데 이 tar가 여러 개의 파일을 한 파일로 이어주는 역할을 한다. 근데 이거는 압축을 하는 게 아니고 그냥 파일이 3개면 3개의 파일을 쭉 가져와서 한 파일로 만들어주는 역할을 한다. 그리고 그 파일을 gzip으로 압축하면 그게 tar.gz가 된다. 이런 식으로 사용할 수 있다.
tar -czf test.tar.gz fileA fileB folderA

이렇게 작성하면 "fileA, fileB, folderA를 test.tar.gz로 만들어줘"가 된다.

-czf 옵션은 compress, gzip, file을 의미한다.

 

압축 해제는 다음과 같다.

tar -cxf test.tar.gz

x는 extract의 약자이다.


  • history: 내가 실행한 커맨드의 히스토리를 출력

  • apt list | grep "package name": apt-get을 사용하여 package를 내려받았을 때 repository의 특정 패키지 (입력한 패키지)가 있는 경우 출력해준다.

  • apt list --installed | grep "package name": apt-get을 사용하여 package를 내려받았을 때 설치된 패키지들을 보여주는 명령어가 apt list --installed다.

  • touch: 파일 생성

  • mv: 파일 또는 폴더 이름을 변경한다. 또는 파일 또는 폴더 경로를 변경한다. 예를 들어, /home/user/test라는 파일이 있으면 아래와 같이 명령어를 입력할 수 있다.
mv /home/user/test /home/user/apple

이는 곧 파일의 경로를 /home/user/apple로 바꿨다고 말할 수 있음과 동시에 해당 파일의 이름을 /home/user/apple로 변경했다고도 말 할 수 있다.


  • ln: 하드 링크 또는 소프트 링크를 만드는 명령어. 예를 들어, ln./home/user/test./home/user/tt라고 한다면 기존에 test라는 파일에 대해서 tt라고 하는 파일로 하드링크가 생성된다. 그리고 이 두 파일의 아이노드는 당연히 같다. 왜냐하면 하드 링크는 아이노드를 그대로 가져다가 사용하기 때문이다. 이를 확인해 보려면 ls -i라는 옵션을 부여해 확인해 보면 된다. -i 옵션은 아이노드의 번호를 보여준다. 아이노드가 같다는 건 해당 데이터도 같고 둘 중 하나만 바꿔도 두 개가 보여주는 값은 백 퍼센트 일치한다는 것을 의미한다. 소프트 링크를 만드는 법은 -s 옵션을 사용한다. ls -s ./home/user/test ./home/user/tt 이렇게 입력하면 소프트링크로 만들 수 있다.

  • chmod: 파일(폴더)에 대한 권한을 변경 (예: chmod 777 ls.log, chmod go+rx ls.log) 예시의 앞은 8진법 표기식, 뒤에는 의미 표기식이다. 

  • adduser: 사용자를 추가하는 명령어 (예: adduser john). 추가할 때 그룹을 지정해주고 싶으면 adduser john --ingroup <group name>

  • deluser: 사용자를 제거하는 명령어 (예: deluser john --remove-home). 이렇게 입력하면 john이라는 유저를 지우면서 해당 유저의 홈 디렉터리도 같이 지운다.

  • addgroup: 그룹을 생성하는 명령어 (예: addgroup <group name>).

  • whoami: 현재 사용자가 누군지 알려주는 명령어.

  • ps: 프로세스 리스트를 보여주는 명령어. 이 녀석은 상당히 중요하니까 자세히 알아보자.

처음 PID는 프로세스 아이디를 의미한다. PID는 고윳값이다. TIME은 CPU를 사용한 시간을 말한다. 그러니까 1589라는 프로세스가 프로세스를 실행하기 위해 CPU를 얼마나 잡아먹었느냐라고 생각하면 된다. 3분 79초를 사용했다는 의미가 된다. CMD는 이 프로세스가 실행한 커맨드(명령어)를 의미한다. 

이제 옵션 -f를 사용해서 ps 명령어를 실행해 보자. -f 옵션은 좀 더 많은 내용을 알려준다.

여기서 UID는 해당 프로세스를 실행시킨 유저의 ID다.  PPID는 부모 프로세스의 ID이다. C는 해당 프로세스의 CPU 사용량을 말한다. STIME은 이 프로세스를 실행시킨 시간이다. 

이제 -e 옵션도 추가해 보자. -e 옵션은 현재 터미널에서 실행한 프로세스 이외에도 모든 프로세스를 조회해 준다. 

굉장히 많은 프로세스가 조회된다. 여기서 보면 CMD 부분에 대괄호로 묶인 녀석도 있고 아닌 녀석도 볼 수 있는데 대괄호로 묶인 녀석들의 의미는 운영체제의 커널이 만든 커널 쓰레드라고 알고 있으면 된다. 즉, 건들면 안 된다는 의미다.

그리고 이 PPID와 관련해서 각 프로세스는 다 부모 프로세스가 있는데 이것을 계층 구조로 볼 수 있는 방법이 있다. --forest 옵션을 주면 된다. 

여기 사진에서 ps -ef --forest라는 프로세스가 보인다. 이 녀석의 부모가 bash인 것도 보인다. 즉, 쉘에서 입력하는 모든 명령어는 곧 쉘의 자식 프로세스가 된다는 사실을 이해해야 한다. 이렇게 ps -ef --forest 명령어도 자식 프로세스인 것을 확인했고 이 프로세스가 출력 후 종료된다는 것을 이해하면 다시 이 명령어를 입력했을 때 같은 PID가 아님을 예측할 수 있다. 

또한, 쉘에서 쉘 스크립트를 사용할 때 쉘 스크립트 역시 쉘의 자식 프로세스다.


  • echo $?: 직전 커맨드의 종료 상태를 출력해 주는 명령어 (0이면 성공 그 외는 실패)

  • &: 커맨드 뒤에 붙여 실행 시 프로세스를 백그라운드로 실행 (예: appium &)

  • jobs -l: 백그라운드 프로세스가 어떤 것이 띄워져 있는지 프로세스 아이디와 같이 출력

  • fg: 백그라운드로 실행한 프로세스를 포어그라운드로 전환하는 명령어. 만약 백그라운드로 실행한 프로세스가 여러 개 있을 때, jobs -l 명령어로 해당 프로세스를 확인하면 맨 앞부분에 인덱스처럼 [1], [2] 이런 식으로 숫자가 보이는데 그 숫자를 기준으로 fg %2 이렇게 입력하게 되면 두 번째 백그라운드 프로세스를 포어그라운드로 변경한다.

  • bg: 포어그라운드 프로세스를 백그라운드 프로세스로 변경하는 명령어. 근데 일단 포어그라운드 프로세스는 사용자의 출력을 출력을 받는 라인이 아닌 이상 받지 않기 때문에 실행 중인 포어그라운드 프로세스에서 Ctrl + Z를 입력하면 중지상태가 된다. 그 후 bg를 입력하면 중지되어 있는 프로세스를 백그라운드 프로세스로 변경할 수 있다.

  • sort: 출력값을 정렬해 주는 명령어. 옵션이 아주 중요한데 -t 옵션이 이제 구분자다. -k 옵션이 구분자를 기준으로 몇 번째 칼럼을 정렬할 것인지를 말한다. 그리고 이 때 컬럼의 순서를 하나만 주면 그 순서부터 마지막 컬럼을 기준으로 정렬한다. 그게 싫고 딱 정한 그 칼럼만을 기준으로 정렬하고 싶다면 -k 칼럼순서, 칼럼순서 이렇게 입력하면 된다. 그리고 그 칼럼의 타입이 숫자인 경우 -k 칼럼순서 -n 이렇게 입력해 주면 해당 칼럼의 타입이 숫자임을 알려준다. 그래서 -n 옵션을 -k 뒤에 안 주면 무조건 문자로 판단한다. 그리고 마지막에 --debug 옵션을 주면 몇 번째 칼럼을 기준으로 정렬하는지 좀 잘 보여준다. 예를 들어 이렇게 사용할 수 있다.
cat /etc/passwd | sort -t: -k 3,3 -n --debug

  • awk: 구분자를 기준으로 필드를 분리해서 어떤 행위를 수행하는 명령어. 예를 들면 이렇다. 
head -20 /etc/passwd | awk -F: '{ print $1 }'

저기서 -F 옵션은 구분자를 지정하는 옵션인데 주지 않으면 공백이 기본으로 기준이 된다. 여하튼 구분자는 ":"를 사용한다는 뜻이고 위에서부터 20줄까지를 출력하는데 출력한 값에서 :를 기준으로 구분된 첫 번째 인자만을 프린트한다는 뜻이다. 결과는 이렇다.

그리고 내장 변수가 몇 개 있는데 가장 대표적인 게 $1, $2이고 얘들은 분리된 필드들의 순서를 기준으로 가져오는 변수고 또 많이 사용되는 것 중 하나가 NR이다. NR은 레코드의 넘버를 의미한다. 그니까 표준 입력값으로 준 내용에서 각 라인의 넘버라고 생각하면 된다. 그리고 NF가 있는데 이는 그 레코드를 구분자를 기준으로 필드를 분리했을 때 분리된 필드의 개수가 몇 개냐를 의미한다.

그래서 이와 같이도 사용 가능하다.

head -20 /etc/passwd | awk -F: '{ print NR "→" $1,NF }'

결과는 다음과 같다.


  • top: 프로세스를 어떤 기준으로 정렬해서 조회/모니터링하는 명령어. 예를 들어, 실행 상태에서 M을 입력하면 메모리 사용량을 기준으로 솔팅, P를 입력하면 CPU 사용량을 기준으로 N은 프로세스 ID, T는 Running Time, R은 역순 정렬 q는 종료.

  • locate: 특정 파일을 찾는 명령어 단 updatedb가 저장해 놓은 DB파일 내에서 검색하기 때문에 누락 파일이 생길 순 있다. 사용법은 이렇다. locate main.c, locate main.c -n 10, locate --regex "/usr/src/.*\/main.c$" usr/src로 시작하는 경로에서 그 이후 어떤 하위 디렉터리든 상관없이(.*) 마지막이 main.c로 정확히 딱! 끝나는 파일을 찾는다. 마지막 $는 마지막임을 나타내기 때문에 무조건 딱 끝나야 한다.
728x90
반응형
LIST

'Linux' 카테고리의 다른 글

Vim 필수 기능 정리  (0) 2023.12.27
Hard Link / Soft Link  (0) 2023.10.04
사용자와 그룹과 파일 권한  (0) 2023.10.04
Linux란 ?  (0) 2023.10.04

+ Recent posts