CS/OS

[Linux] 리눅스 커맨드라인 툴 기초

창문닦이 2019. 9. 24. 12:06
  • 개요 : 리눅스 커맨드라인은 신입 개발자의 기본 소양. 알면 알수록 빠르고 편해진다.

    • 리눅스는 수십년을 이어온 강력한 .
    • 리눅스는 GUI 프로그램만으로는 조금 부족. 알수록 강력함.
    • 개발 환경/ 소프트웨어 구동 환경으로 리눅스를 사용하는 곳이 많다.
    • 클라우드 환경에 설치되는 가상 OS 비율은 리눅스 9 : 윈도우즈 1
    • 사람은 GUI 프로그램을 사용할 있지만 소프트웨어는 GUI 프로그램을 사용할 없다. 시스템 프로그래밍, 커맨드 라인 툴을 이용해 시스템 정보를 처리해야 한다
  • 텍스트 처리

    • 옵션
    • -c, --bytes=[-]NUM : NUM byte 출력, byte 입력시 K,M,G,T 입력가능
    • -n, --lines=[-]NUM : NUM line 출력
    • NUM '-'입력시 문서의 마지막 NUM byte/line 제외하고 출력
    • head -n -5 /etc/test.txt  : test.txt파일의 마지막줄 5줄을 제외하고 출력하라
    • head : 문서 내용의 앞부분을 출력하는 명령어. 기본적으로 10 출력.

    • cat : 문서 내용의 처음부터 끝까지를 전부 출력하는 명령어.

    • tail : 문서 내용의 부분 출력하는 명령어. 옵션이 없으면 기본적으로 마지막 10줄을 출력.
      • 옵션
      • -c, --bytes=[+]NUM : NUM byte 출력, byte 입력시 K,M,G,T 입력가능
      • -n, --lines=[+]NUM : NUM line 출력
      • NUM '+'입력시 문서의 마지막 NUM byte/line 에서 출력 시작
      • -f, --follow[={name|descr}] 추가되는 내용 대기. 추가되는 내용은 append 하여 출력
      • -F, 파일이 truncate 되는 경우 re-open하여 follow (로그 파일이 너무 커지는 것을 대비한 logrotate되는 파일에 유용)
      • 모니터링이나 디버깅할때 자주 사용되는 명령어.

    • wc : word count 명령어 문서의 워드/라인/캐릭터가 몇개나 있는지에 대해 세주는 명령어
      • wc -l /etc/test.txt | awk '{ print $1 }'
      • awk '{ print $1 }' 띄어쓰기를 기준으로 첫번째 토큰을 출력하라
      • wc -l /etc/test.txt | cut -d ' ' -f 1
      • cut -d ' ' -f 1 공백을 기준으로 토큰화해서 첫번째 토큰을 출력해라
      • 옵션
      • -l : 라인수만 출력
      • 라인수가 중요한 이유는 자유롭게 메모장에 일기를 적는다하면 줄수는 중요히 않음. head tail에서 것처럼 줄에 하나의 설정이 들어가는 파일이 있을 있음. 라인이 3줄이면 설정값이 3 있구나 하고 있음. 이런 경우가 빈번하기 때문에 라인의 갯수를 알게 되면 유용하게 사용할 수있다.
      • 옵션없이 사용할 경우 라인/워드/byte count 전부 출력된다. 
      • 두개 이상의 파일을 한꺼번에 출력하고  합계 정보 또한 출력할 있다.
      • 필요한 라인수만 가져다가 쓰고 파일명은 제거하길 원할 경우 cut이나 awk 명령어 사용가능.

 

    • nl : 파일 내용을 출력할때 라인넘버를 붙여서 함께 출력해주는 명령어
      • nl [FILENAME]
      • cat [FILENAME] | nl
      • nl 조회시 아무것도 기재되지 않은 라인에는 라인수가 카운트되지 않음. wc 카운트시 전체 라인수와 차이가 생긴다. 이런 경우에 사용하는 것이 -ba옵션.  
      • 옵션
      • -ba : 모든 라인에 대해 라인 넘버링. 공백인 줄도 같이 카운팅.
      • -v N : 시작 라인 넘버를 N으로 지정
      • -s : 라인 넘버 출력 출력할 separator 지정
      • 문서 작성시 코드를 첨부해서 설명해야 경우 라인 넘버로 설명하는 것이 편리하다.

    • sort : 정렬하여 출력
      • -k, --key=KEYDEF : key 의한 정렬 수행
      • -t, --field-seperator : 필드 구분자(기본값은 공백 문자). 컬럼을 나뉘어 주는 (마치 엑셀처럼)
      • -f, --ignore-case : 대소문자 구분 없음
      • -g, --general-numeric-sort
      • -n, --numeric-sort : 숫자로 인식해서 정렬
      • -r, --reverse : 기본적으로 오름차순이므로 내림차순 정렬 진행
      • -u, --unique : 행과 행이 일치하는 경우 중복되는 줄을 제거해서 하나만 출력
      • 콜론을 기준으로 행을 분리해서 세번쨰 컬럼을 키값으로 해서  정렬
      • 파일 크기로 정렬.
      • 위치지정
      • 정렬기준
      • 대부분 특정 컬럼을 지정하여 정렬하는 일이 많음.
      • cat /etc/test.txt | sort -t: -k 3
      • --debug 옵션을 추가하면 어느 기준으로 정렬을 한건지 조회할 있다.
      • key값은 여러 설정할 있다.
      • ls -al | sort -k 5 -n

    • uniq : 중복된 내용 제거하고 출력
      • 옵션
      • -d, --repeated : 중복된 내용만 출력
      • -u, --unique : 중복되지 않은 내용만 출력
      • -i, --ignore-case : 대소문자 무시
      • 연속적으로 중복된 내용만 제거해주므로 sort 함께 사용한다
      • sort [파일명]  | uniq -i | nl

 

    • cut : 컬럼 잘라내기. 문서의 내용에서 기준을 가지고 잘라내서 출력할 사용.
      • 라인수와 파일명을 출력한 결과중에 첫번째 필드를 출력해라. 출력하는 구분자는 > 사용
      • 옵션
      • -b, --bytes=LIST  : byte 선택. range 설정 가능.
      • -c, --characters=LIST : character 선택
      • -f, --fields=LIST : 필드 컬럼 선택. 필드는 여러 선택이 가능하다.
      • -d, --delimiter=DELIM: tab대신 사용할 구분자 지정. -d 옵션이 없으면 tab으로 반영
      • --complement
      • --output-delimiter=STRING
      • wc /etc/test.txt -l | cut -d ' ' -f 1,5 --output-delimeter=">"

    • tr : 어떤 내용을 변환(translate)한다. 변환되는 내용은 옵션에 따라 다르다.
      • CHAR1-CHAR2 : char1부터 char2까지의 문제 세트( : 'a-z')
      • [:alnum:] : 문자 + 숫자
      • [:alpha:] : 문자
      • [:blank:] : 공백
      • [:space:] : 공백 + newline
      • [:digit:] / [:xdigit:] : 10진수 숫자 / 16진수 숫자
      • [:lower:] / [:upper:] : 소문자 / 대문자로 변환
      • 현재 경로에서 / 모두 지워서 출력
      • 현재 경로에서 /자리에 % 변환하겠다.
      • 모든 소문자를 대문자로 변환.
      • 기본 사용법 : tr [OPTION] … SET1 [SET2]
      • 옵션
      • -c, -C, --complement
      • -d, --delete
      • SET
      • 특수한 캐릭터를 지울때 사용하는 경우 쓰일 있음.
      • pwd | tr -d '/'
      • pwd | tr '/' '%'
      • pwd | tr [:lower:] [:upper:]
      • 소스코드로 만들어야 하면 파일을 읽고 변환해서 내보내는 작업이 이뤄지므로 복잡해진다. 리눅스 단에서 처리하게 되면 tr 사용한 커맨드 라인으로 간단하게 사용할 수 있다.
    • sed : stream editor. 사용자가 조작할 있도록 도와주는 에디터.
      • 한줄씩 읽으면서 처리하기 때문에 기본적으로 처리된 스트림을 받아 sed 수행된다. 2~5줄은 두번씩 출력된다. 2~5 출력되길 원한다면 -n 옵션을 추가해야 한다.
      • 검색된 내용만 출력해라
      • 검색되지 않은 내용만 출력해라
      • root ROOT 교체해서 출력
      • 옵션
      • {RANGE}p : range 내의 라인을 출력
      • {RANGE}d : range 내의 라인을 삭제
      • /SEARCHPATTERN/p : SEARCHPATTERN 매치되는 라인을 출력
      • /SEARCHPATTERN/d : SEARCHPATTERN 매치되는 라인을 삭제
      • s/REGEX/REPLACE/ : REGEX 매치되는 부븐을 REPLACE 교체(substitute). 치환
      • head /etc/test.txt | sed '2,5p'
      • head /etc/test.txt | sed -n '/sy/p'
      • head /etc/test.txt | sed -n '/sy/d'
      • head /etc/test.txt | sed -n 's/root/ROOT/'
    • awk : 텍스트 처리 script language.
      • -F : field seperator 지정
      • $1, $2, $3, … : Nth field
      • NR : number of records
      • NF : number of fields
      • FS : field separator(default 'white space')
      • RS : record separator(default 'new line')
      • OFS : output field separator
      • ORS : output record separator
      • / 구분자로 필드를 구분해서 첫번째 필드를 출력
      • / 구분자로 sy일치하는 필드를 찾아 세번째 필드를 출력
      • 레코드수와 세번째 필드를 출력
      • syntax : awk options 'selection _criteria {action }' input-file
      • 옵션
      • 주요 내장 변수
      • ls -al | awk '{ print $1 }'
      • wc -l /etc/test.txt | awk -F/ '{ print $1 }'
      • wc -l /etc/test.txt | awk -F/ '/sy/ { print $3 }'
      • wc -l /etc/test.txt | awk -F/ '/sy/ { print NR $3 }'
      • 복잡한 스크립트를 작성하게 되면 다양한 내장변수를 사용하게 된다.

  • 검색

    • find [OPTION] path EXPR
    • 옵션
      • -name : 이름으로 검색
      • -regex : regex 매치로 검색
      • -empty : 디렉토리 혹은 파일 검색
      • -size : 파일 사이즈로 검색(M, G 표기 가능)
        • -N : 이하
        • +N : 이상
      • -type : 파일 타입으로 검색
        • d : directory
        • p : named pipe
        • f : regular file
        • l : softlink
        • s : socket
      • -perm :  퍼미션으로 검색
        • mode : 정확히 일치하는 파일
        • +mode : 모든 flag 포함된 파일
        • /mode : 어떤 flag라도 포함된 파일
      • -delete : 파일 삭제
      • -ls : ls -dils 명령 수행. 파일 사이즈 여러가지 필드를 보여줌
      • -print : 파일 이름을 출력(default)
      • -printf : 파일 이름을 포맷에 맞게 출력
      • -exec : 주어진 명령 수행
      • -execdir : 해당 디렉토리로 이동하여 명령 실행
      • -ok : 사용자에게 확인 exec. 파일을 찾아 실행하는게 맞는지 확인
      • -okdir : 사용자에게 확인 실행 execdir.
      • 조건
      • 액션(유용하지만 잘못 사용하면 재앙이 있음)
    • grep [OPTIONS] PATTERN [FILE…]
    • 옵션
      • -r : recursive. 디렉토리의 하위까지 반복하면서 탐색.
      • -i : ignore case. 대소문자 무시
      • -v : invert match. 패턴과 매치가 되지 않는 것들을 찾아준다.
      • -q : quiet mode. 화면상 아무런 것도 출력하지 않는다. 검색 성공 성공값 리턴. (0 성공. 1 실패)
    • grep stdio *.c
    • grep ftok *.c | awk -F: '{ print $1 }' | sort -u
      • ftok 쓰여진 c파일을 찾는데 : 구분자로처 첫번째 필드를 유니크로 정렬해서 보여줘라.
    • grep "\<for\>" *.c
      • 단어 단위로 패턴을 검색
    • 자주 사용하는 옵션 : -s, --section=LIST, --section=LIST : 탐색할 섹션을 colon으로 구분하여 입력
    • 파일 시스템 전체에 대해서 검색을 진행하는데 직접 검색하는 아니라 인덱싱을 이용한다. updatedb 만들어두고 파일을 뒤져서 검색하는 .
    • , updatedb 저장해놓은 DB파일 내에서 검색하므로 누락파일이 생길 있다.
    • locate [OPTION] … PATTERN…
    • 옵션
      • -i, --ignore-case : 대소문자 구분없이 검색
      • -l, --limit, -n limit : 출력결과를 LIMIT 만큼만 출력
      • --regex : PATTERN regex 해석
    • 일반적인 파일은 검색이 안되고 실행파일만 가능하다.
    • ls라는 파일을 수정해서 실행하고 싶은데 위치를 몰라 알고싶을 사용한다.
    • PATH라는 환경변수를 따라가면서 해당 명령어가 어디있는지 depth 내려가면서 검색한다.
    • find : 파일의 이름이나 속성을 이용해 조건에 맞는 파일을 찾아 명령을 수행한다
    • grep : 파일 내용 원하는 내용을 찾는다.
    • apropos : 정확한 함수명이나 커맨드가 기억나지 않을 경우 man page 이름과 설명을 검색한다.
    • locate : 파일의 위치를 찾아 보여준다
    • which : 실행파일의 위치를 보여준다.

 

  • 시스템 정보

    • ps
      • ps -elf(-aux)
      • 현 시스템에서 수행중인 프로그램과 데몬 상태를 보여주는 명령어이다.
    • top
      • 시스템 자원(cpu, memory 등)의 사용현황을 보여준다.
    • lsof
      • list open files을 뜻하는 명령어이다.
      • 수많은 유닉스 계열 운영 체제에서 열려있는 모든 파일과, 그 파일들을 열고 있는 프로세스들의 목록을 출력한다.
    • netstat
      • 현 시스템에서 사용되는 통신 서비스의 상태를 보여준다. 
      • 개인적으로 많이 사용하는 옵션은 -anpt 이다.
    • sysctl
      • sysctl은 버전 번호나 보안 설정 같은 시스템 커널의 속성들을 읽고 수정하는 명령어이다.

 

  • 텍스트 편집

    • vim

 

  • 개발 도구

    • diff
    • patch
    • cscope
    • ctags
    • strace
    • gdb
    • valgrind

 

이 내용은 리눅스 커맨드라인 툴 강의를 보고 정리하였습니다
https://www.inflearn.com/course/command-line#

 

'CS > OS' 카테고리의 다른 글

[Linux] 자주 사용하는 명령어 정리1  (0) 2019.09.28
[Linux] RPM 과 YUM  (0) 2019.09.27
[Linux] 생활코딩 리눅스 강좌 (3)  (0) 2019.09.23
[Linux] 생활코딩 리눅스 강좌 (2)  (0) 2019.09.17
[Linux] 생활코딩 리눅스 강좌 (1)  (0) 2019.09.16