CS/OS

운영체제 : 3.Linux OS 이용/관리 : 3.명령어 : 2. 호출/검색/필터링

OSP 2024. 12. 5. 18:35

3. Linux OS 이용/관리


3.3. 명령어


3.3.2. 호출/검색/필터링


3.3.2.1. cat

  • concatenate. 여러 파일을 결합하거나 파일의 내용을 출력한다.
  • cat 옵션 파일명
  • 많은 명령어의 출력값이나 환경변수들은 여러 디렉토리에 분산 저장되어 있는 내용을 호출하는 것이기 때문에, 근거가 되는 구체적인 경로를 알면 여러 명령어나 환경변수를 몰라도 되는 경우가 많다.(예 : $SHELL, whoami는 /etc/passwd에서 가져온다) 
  • which(Which command is being executed?) 명령어로 해당 명령어의 경로를 출력할 수 있다. 그러나 그 파일이 실행파일인 경우에는 cat으로 출력해도 대체로 기계어라는 어려움이 있다. 그러나 화면에 출력되는 문자열은 그대로 포함하기에 string명령어와의 결합으로 찾아낼 수도 있다.
    pwd는 실행파일이기에 기계어로 출력된다.
  • 함께 쓰기 좋은 명령어는 하기와 같다. 
명령어 및 기본형태 내용
head 파일 파일 앞에서 몇 줄만 출력한다. (기본 10줄)
tail 파일 파일 뒤에서 몇 줄만 출력한다.
more 파일 파일을 전부 읽고 파일 내용을 한 페이지 단위로 출력. 단방향 지원
less 파일 파일을 읽어가면서 파일 내용을 한 페이지 단위로 출력. 양방향 지원
comm 파일1 파일2 두 파일의 내용을 같은 행끼리 비교하여 단순하게 출력. (onl1, only2, common)
diff 파일1 파일2 두 파일의 내용을 같은 행끼리 비교하여 구체적으로 출력 (추가, 삭제, 변경)

3.3.2.2. find

  • 지정된 디렉토리의 모든 서브디렉토리/파일을 중 조건에 맞는 것들을 출력한다.
  • find 경로 옵션 조건
  • find 명령은 상대경로로 지정하면 상대경로로 출력되고, 절대경로로 지정하면 절대경로로 출력된다. 여기서 주의할 것은 그 "/"를 포함하여 출력된 경로 전체를 대상으로 조건을 살핀다. 
    의미 없는 sp/t를 조건으로 잡아도 출력되는 모습.
    절대경로의 경우에는 잡히지만 상대경로는 잡히지 않는 모습을 알 수 있다. 절대경로에선 test[]의 위치가 /home/osp/test[] 이지만, 상대경로에선 ./test[]이기 때문이다.
  • ls | grep과 상당히 유사하다. 특히 ls의 -R(서브디렉토리), -l(세부정보)를 이용하면 대단히 비슷하다. 다만 find과 grep은 *의 용법이 다르다.(와일드카드/정규표현식)
    find의 경우에는 서브디렉토리까지 한 번에 검색하지만 ls의 경우에는 -R 옵션을 입력해야 서브디렉토리까지 검색한다. 또한 ls는 대상 파일의 경로도 출력하지 않는다. 참고로 /home/osp = .이다.

3.3.2.3. grep

  • global regular expression print. 정규표현식에 일치하는 부분을 및 그 행을 출력한다.
  •  grep 옵션 조건 파일명
  • 시각적으로 편리한 도구이기 때문에 파이프(|)로 다른 함수의 출력을 입력으로 받아서 원하는 걸 찾을 때 쓰기 좋다.
형태 내용 예시
grep "ab" testgrep testgrep 파일의 내용에서 ab문자열 부분과 그 행을 출력 하기
cat testgrep | grep "ab" testgrep 파일의 내용에서 ab문자열 부분과 그 행을 출력
cat /etc/passwd | grep "/bin/bash" /etc/passwd 파일의 내용에서 /bin/bash문자열 부분과 그 행을 출력 계정챕터

-v는 빼고, i는 대소문자 구별 없이, -n는 라인도 함께 출력하기이다.


3.3.2.4. cut 

  • cut. 지정된 구분자를 기준으로 필드를 잘라내어 출력한다.
  • cut 옵션 파일/출력
  • 구분점이 있거나 크게 잘라내는 등 동작 단순할 때 유용하다. 옵션은 작업내용이며, 파이프 친화적이다.

-d(구분자)를 기준으로 몇번째 -f(필드)의 값을 출력, 필드는 좌측부터 1부터 시작한다. -c옵션으로 출력할 문자의 위치도 지정할 수도 있다.


3.3.2.5. awk

  • aho, weinberger, and kernighan(각 개발자들의 성). 
  • awk '조건{동작}' 파일/출력
  • 하나의 awk에 여러 '{}'을 넣을 수는 없지마 하나의 '{}'에 여러 조건/동작을 넣을 수는 있다.
  • 정교한 cut이라고 할 수 있다. 구분자를 여러 개 지정할 수 있을 뿐 아니라 조건문, 반복문을 지정할 수도 있다. 내부에서 변수선언도 가능하기에, 이 안에서 스크립팅을 짤 수도 있다. 이 역시 파이프친화적이다.

:를 필드 구분자로 채택하고 1필드가 2보다 큰 경우 awk의 처리행과 1필드값을 출력하고, 이어서는 1필드가 1이나 2인 경우에는 문자열과 1필드값-1을 함께 출력한 모습. awk은 cut보다 정교하고 강력한 도구이다.


3.3.2.6. sort

  • sort. 파일 내 텍스트를 정렬하여 출력한다.
  • sort 옵션 파일
  • 리다이렉션을 통해 그 출력값을 새로운 파일에 저장하는 방식이 흔히 사용된다.
  • 행 앞의 아스키ID를 기반으로 한 오름차순 정렬을 디폴트로 한다.(내림차순 : -r, 열기반 : -k)

-k n,m은 n열과 m열을 하나의 묶음으로 보아 한 번에 정렬하겠다는 것이다. -k n,n -k m,m 은 n열에서 정렬하고 나서 그 속에서 m열의 정렬을 따르겠다는 것이고, -k n은 기본적으로 -k n,n -k n+1,n+1알고리즘을 채택한다. 후순위 정렬을 바꾸려면 마지막처럼 정렬순서를 수기로 지정해야 한다.


3.3.2.7.sed

  • stream editor. 파일 내 텍스트를 편집해 출력한다. 
  • sed 작업 파일
  • 일정한 규칙성이 있는 파일에 대해 그 규칙성을 다른 규칙으로 대체할 때 사용한다. 대상 파일이 짜임새를 갖추었을 때 유용하며, 변수 지정 철학이 천방지축인 경우 짱구 엄빠보다 머리가 복잡해진다.

testsed 파일의 p문자를 b문자로 대체하여 출력한다. 단 출력만 한다. 변경사항을 저장하려면 -i 옵션을 사용해야 한다.
s/oldtxt/newtxt/ = s/oldtxt/newtxt/1으로 매 행의 1번쨰 oldtxt만 newtxt로 치환한다.g는 전부 치환한다. n행만 치환하려면 맨 앞의 s 대신 ns를 (1s 등)입력하면 된다.
ni\newtxt는 n행의 앞에 newtxt문자열을 새로운 행으로 추가하는 것이고, i\newtxt는 모든 행 앞에 추가한다. /가 아니고 \이다. 안 써도 동작하기도 하나 POSIX 표준을 위해 쓰는 것이 권장된다. 행의 맨 앞에 무엇을 추가혀려면 s/^/newtxt를 사용한다
행의 시작 지시자^, 마지막 지시자$를 이용해 행과 맨 앞/뒤에 newtxt를 추가한 모습. 만약 endtxt로 끝나는 행의 마지막 부분을 바꾸려면 endtxt$로 지정하면 된다. awk 에서는 변수 선언과 호출이 가능한 반면, sed에서는 그렇지 않기에 행에 따라 다른 작업을 지정하려면 쉽지 않다.
nc\newtxt는 n행을 newtxt로 교체한다.


3.3.2.8. tr

  • translate. 문자를 변환하여 출력한다.
  • tr 옵션 oldtxt newtxt
  • 조건이 단순하고, 예외나 지정같은 게 없어 일괄적으로 바꾸는 단순한 문자 변환에 이용된다. 텍스트 처리 자동화 스크립트의 초반부에 위치하기 쉽다.

-d 옵션은 삭제, -s옵션은 연속중복문자를 하나로 압축한다.
문자열이라기보다는 문자순번집합이라 보는 게 옳다. tr p b를 각각 대응되는 순서에 위치한 문자끼리 바꾸는 것이다.


3.3.2.9 strings

  • strings. 파일 내의 텍스트 문자열을 출력한다.
  • strings 파일명
  • 유니코드, ASCII 외에도 특히 실행파일은 바이너리/기계어로 저장되어 있기도 하다. 다만 이 때에도 어차피 출력하는 내용들은 유니코드/ASCII 그대로 포함되어 있기 때문에 그 부분만 출력하는 것.
  • 텍스트를 보고 소스코드를 추론하는 리버스엔지니어링에 의미가 크다.
옵션 내용
-n 길이 출력되는 문자열의 최소 길이 (디폴트=4)
-e 인코딩방법 -e b : 7비트 ASCII (디폴트)
-e l : 리틀 엔디안 유니코드
-e B : 빅 엔이안 유니코드

 

cat /bin/ls의 출력값이다. 프롬프트 자체가 기계어로 전환된다. 저 화면에서 reset을 입력하면 복귀한다.
strings /bin/ls의 출력값. 뭔지 모르는 건 매한가지일지 몰라도 이건 읽을 수는 있다.


3.3.2.10. 암호화/인코딩

  • Encryption /Encoding. 어떤 문자열을 특정 규칙에 따라 다른 문자열로 변환해 출력한다.
  • 일방향성/양방향성, 보안성/호환성의 목적성이 반대되나 입력값에 대해 변환 규칙을 제공하는 함수라는 측면에서는 같다. 말하자면 f(x)의 f이다.
명령어 및 기본 형태 풀네임 기능
iconv -f 인코딩A -t 인코딩B 파일 internationalization conversion 파일/표준입력을 디코딩A후 인코딩B 하여 출력한다.
base64 파일형태 base 64 파일/표준입력을 base64로 인코딩 후 출력한다.
shasum 옵션 파일 secure hash algorithm checksum 파일/표준입력을 문자열의 SHA 해시값을 출력한다.(디폴트 SHA-1)
md5sum 파일 message digest algorithm 5 checksum 파일/표준입력을 문자열의 MD5 해시값을 출력한다.
openssl 기능 옵션 open source sockets layer 인코딩/디코딩, 암호화/복호화, 해시출력 등 다양한 보안 기능을 갖는다.

 


3.3.2.11. pwd

  • present working directory. 현재 작업중인 디렉토리를 출력한다.
  • 프롬프트 셸에서는 출력되고, 사용자의 기본 디렉토리는 ~로 기호화된다는 점을 알면 셸에서는 크게 쓸 일이 없다. 다만 스크립트를 짜려면 알아두는 게 좋다.
  • 특정 디렉토리에 저장된 값을 불러오는 것이 아니기에 cat으로 호출할 수 없다.


3.3.2.12. hostname, whoami, $SHELL

  • hostname. 시스템(컴퓨터 또는 단말) 이름을 출력한다.
  • whoami. 사용자 이름을 출력한다.
  • $SHELL. 셸 환경 값을 가지고 있는 변수이다.
  • hostname은 /etc/hostname에, whoami와 $SHELL은 /etc/passwd에서 불러온다.
  • 다만 hostname같은 경우에는 /etc/hosts 에서 IP주소와 호스트명을 매핑하므로 /etc/hostname과 /etc/hosts의 동기화가 권장된다. 


3.3.2.13. file

  • file type. 대상의 종류를(디렉토리, 텍스트파일, 바이너리파일, 실행파일) 출력한다.
  • file 파일명
  • 정확히는 호출이 아니라 대상 파일에 대한 정보를 분석/연산해서 그 종류를 식별하는 알고리즘이고, 특정 디렉토리에 저장된 값을 불러오는 것이 아니기에 cat으로 호출할 수 없다.
  • .txt혹은 .exe등의 확장자명은 편리한 식별 기준이지만 실제 파일 형식과 항상 일치하는 것은 아니고 file 명령어를 사용하는 것이 신뢰성이 높다.


3.3.2.14. ps, top

  • process status. 현재 실행중인 프로세스 상태를 단발성으로 출력한다.
    ps는 현재 터미널 세션에 대한 프로세스만을, ps aux는 시스템에서 실행중인 모든 프로세스를 출력한다.
  • table of process. 프로세스 상태와 리소스 사용량을 실시간으로(디폴트 3초) 모니터링한다. 윈도우의 ctr+atl+del와 대등하다.
    d를 눌러 갱신 주기를 확인하는 모습이며, esc로 명령모드로 전환한 다음 q를 눌러야 프롬프트로 복귀한다.

3.3.2.15. df, du

  • disk free. 파일시스템 단위로 디스크 사용량을 확인한다. 단위를 보면 알 수 있듯 디렉토리 지정 옵션이 없다.
    옵션이 없으면 KB, -h옵션을 붙이면 MB/GB단위로 출력된다.
  • disk usage. 디렉토리/파일 단위로 디스크 사용량을 확인한다. 디렉토리를 지정해서 확인할 수 있다.
    du는 디렉토리의 디스크 사용량만 나오고, du -a 옵션은 디렉토리와 파일의 디스크 사용량을 출력한다.

3.3.2.16. history

  • history. 현재 세션과 과거 세션의 모든 커맨드 기록을 출력한다.
  • 현재 세션의 커맨드 기록은 메모리에 기록되며, 세션 종료시 숨김파일인 /home/osp/.bash_history에 기록된다.
  • 현재 세션의 커맨드 기록은 history -w로 숨김파일에 저장할 수 있으며 -c옵션으로 제거할 수 있다.
  • 과거 세션의 커맨드 기록은 rm ./.bash_history 또는 > ./.bash_history)로 제거할 수 있다.

history -w로 입력 해야 ./.bash_history파일에 현재 세션의 커맨드 기록이 남겨진다.
history -w는 기존 ..bash_history파일을 덮어쓴다. 이어쓰기는 history -a
history -c는 메모리 비우기이기 때문에 .bash_history파일에 이미 기록된 것은 건들지 않는다.
일반적으로 기대되는 로그대로 기록되며, 중복되는 값의 처리는 이미 내재화되어 있다.

과거 세션 커맨드 기록 현재 세션 커맨드 기록
./.bash_history에 저장 메모리에 저장(파일 형태 X)
파일 제거/덮어쓰기로 삭제 history -c로 삭제
history -w 또는 -a 옵션으로 현재 세션의 커맨드 기록을 ./.bash_history에 저장할 수 있다.