Linux

[Linux]: 내가 쓰려고 기록한 유용한 Commands

cwchoiit 2023. 10. 4. 10:16
728x90
반응형
SMALL
728x90
반응형
  • 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