🐧 Linux

리눅스 필수 기초 명령어 정리

loose 2022. 7. 30. 19:53
반응형

요즘에는 Windows에 리눅스 환경을 실습하기가 너무 편하다.

마이크로소프트 스토어에서 우분투 설치만 하면 간단하게 터미널 실습을 할 수 있다.

쉘과 터미널의 차이 


쉘은 명령어 인터프리터이다. 
터미널에 사용자가 직접 입력을 하면 명령이 쉘로 전송되어 입력을 해석하고 즉시 실행한다. 
터미널은 쉘에 대한 그래픽 인터페이스 개념이다.

터미널 > 쉘 > 커널 순서로 동작한다.

커널은 가장 내부에 위치하며 프로세스 관리, 메모리 관리, 저장장치 관리와 같은 운영체제의 핵심적인 기능을 모아놓은 것이다. 

리눅스 기본 명령어(pwd cd ls rm mkdir cat)

pwd - 현재 경로 위치 출력

cd - 경로 이동(./는 자기 자신의 경로)

ls - 현재 경로의 파일 및 폴더 출력

rm - 파일 삭제

mkdir - 폴더 생성

cat - 파일 출력(cat test.txt)

참고 - cat > test.txt라고 입력하면 test.txt 파일이 만들어진다.

mv test.txt new_folder - new_folder로 파일을 옮긴다.

mv test.txt new_test.txt - new_test.txt로 파일명을 바꾼다.

파일 검색 혹은 텍스트 검색 - grep

sudo grep -r -E "(this|use) (program|the)" "/etc/ufw"

/etc/ufw 밑에있는 설정 파일 내 문자를 검색했다.

grep -r -E "찾을 문자열" "경로"

-r은 지정한 경로의 하위까지 전부 찾는다.

-E는 단순 문자열 검색이 아닌 정규표현식을 사용할 때 필수로 넣어줘야 한다.

-v "문자열" 옵션을 쓰면 문자열 제외도 가능하다.

 

리눅스 파이프라인(pipeline)과 리다이렉션(redirection) - | , >, >>

|는 명령어 간의 연결을 할 수 있다. 아래 코드는 ls의 내용을 grep으로 잡아서 ls.txt로 저장한다.

ls | grep ls.txt

아래는 hello라는 문자열을 찾아서 페이지 단위로 여는 명령어다.

grep "hello" | less

 

>는 파일을 기존 파일을 덮어쓰면서 저장한다. 

ls > ls.txt

꺽쇠 2개를 이용한 >>는 파일 내용 끝에 추가해서 저장한다.

ls >> ls.txt

편집기 사용 - vim

vim test.txt로 파일을 수정할 수 있다. 파일이 존재하지 않으면 새 파일을 만들어진다.

vim으로 처음 열면 어떤 모드로 들어갈지 선택할 수 있는 노멀모드 상태부터 시작한다.

노멀모드부터 어떤 키를 입력하느냐에 따라 입력 모드로 들어갈 수도 있고 복사 모드로 들어갈 수도 있다.

위 그림처럼 노멀모드에서 i를 누르면 입력이 가능해진다.

다시 노멀모드로 돌아가서 선택하고 싶으면 esc를 누른다. 

vim에서 나가려면 :q (나가기) 혹은 :wq (저장 후 나가기)

둘 중 하나 입력하면 된다.

편집모드 - i


vim을 열고 편집기의 i를 누르면 편집이 가능하다.
vi와는 다르게 키보드의 화살표로 커서 이동이 가능하다.

 

검색모드 - /

/를 누르면 검색이 가능하다.
문자를 입력하고 Enter를 누르면 검색이 가능하고 해당 위치에서 i를 누르면 검색된 부분을 편집모드로 수정가능하다. 
검색된 문장에서 n을 누르면 다음 문장을 검색하게 된다.
대문자 N은 뒤로 검색할 수 있다.

 

복사모드 - v

v를 누르면 화살표로 드래그를 할 수 있다.
드래그가 끝난 뒤 y를 누르면 복사완료(양크 완료)
shift + p 누르면 붙여넣기를 할 수 있다.

 

일시정지 - ctrl+z


vim을 쓰다가 ctrl+z를 쓰면 일시정지를 하고 vim을 빠져나오게 된다.(보통 문자 지우려다가 습관적으로...)
바깥에서 fg를 입력하면 다시 vim으로 돌아갈 수 있다. 

 

되돌리기 - U


실제 되돌리기는 노멀모드에서 U키를 누르면 undo가 가능하다. 
redo는 ctrl + r을 누르면 된다. 

 

일괄변경

노멀모드에서 :%s/test/text/ 라고 하면 test를 text로 일괄 변경이 가능하다.

 

가상단말 - tmux

tmux를 사용하면 가상단말을 이용해서 ssh에 접속이 가능하다.
장점으로는 ssh에 대한 연결이 강제로 끊길 경우에 tmux attach로 접속이 끊기기 전으로 돌아간다. 
그리고 화면 분할도 가능하다. 

 

명령어 히스토리

vim ~/.bash_history

여태 입력했던 리눅스 명령어 history를 볼 수 있다. 

파일 권한 수정 - chmod

어떤 경로든 ls -al로 현재 파일과 폴더 상태를 확인해보면 좌측에 rwx로 권한부여가 되어있다.

r - read, w - write, x - execute

순서대로 읽기, 쓰기, 실행 권한이다.

총 9칸이 존재하는데 앞의 3칸은 소유자(user), 중간 3칸은 그룹(group), 끝 3칸은 그 외 사람들(other)로 구성되어 있다.

 

chmod 700 srv

위와 같은 명령어를 입력하면 숫자 부분을 2진수로 치환한다.

7은 111이다.

1로 체크된 부분만 권한이 들어간다.

그러므로 700은 rwx------로 권한이 생성된다. 

chmod +x test.txt

+x로 전체 대상에게 실행 권한을 주는 것도 가능하다.

루트 디렉토리와 홈 디렉토리

cd /


리눅스 파일 체제의 최상의 디렉토리로 루트 디렉토리라고 부르며 모든 디렉토리들의 시작점을 나타낸다. 

cd ~

위 코드를 입력하면 홈 디렉토리로 이동한다. 홈 디렉토리는 루트 디렉토리가 아니다. 홈 디렉토리는 루트 디렉토리 하위에 있는 home 아래에 있는 사용자의 디렉토리를 말한다. 처음 로그인하면 접속되는 위치를 말한다.

 

서버 간의 파일 복사 - scp

cp는 파일을 복사하는 행위지만 scp는 서버에서 서버로 복사가 가능하다.(송수신 서버가 모두 scp가 설치되어있어야 함)

scp를 cp처럼 사용해보기

scp를 cp처럼 사용해 봤다. scp를 사용하면 반대편 서버에 있는 파일을 복사할 수도 있다.
폴더 자체를 복사하려면 -r를 써서 재귀적으로 모든 걸 복사할 수도 있다.

과부하 확인 - top


top을 쓰면 과부하를 확인할 수 있다.

load average는 1분당 평균 몇 개의 일이 쌓이는지 볼 수 있다. 
load average가 4면 쿼드코어 환경에선 적절하다고 볼 수 있지만 조금이라도 넘어서면 과부하 상태라고 보기 때문에 좋다고 볼 순 없다. (load average >= cpu 코어수는 과부하 상태)

c를 누르면 해당 프로세스가 어떤 명령어로 실행된 건지 알 수 있다. 
load average는 시간 대비 평균치이기 때문에 프로세스가 죽는다고 해서 바로 반영되지 않는다.
간혹 cpu가 과부하가 걸려도 $CPU 부분의 퍼센티지가 낮을 때도 있는데 이럴 땐 메모리가 부족한 것이다. 그럴 땐 $MEM 부분이 높은 프로세스를 죽여야 한다

q를 누르면 나갈 수 있다.

 

페이지 단위로 파일 열기 - less


less로 로그파일을 열면 페이지 단위로 열려서 space로 넘길 수 있다.

less test.txt

 

실시간 로그 확인 - tail

tail은 꼬리라는 뜻에서 tail만 쓰면 뒤에서부터 읽는 기능이다.

하지만 tail -f를 쓰면 실시간 로그를 확인하는 용도로 사용가능하다.

tail -f text.txt

변수 설정

log=/var/log/


log라는 변수에 경로가 입력이 되어서 cd $log로 바로 사용할 수 있다.

아래에서 서술할 쉘 스크립트에서도 쓸 수 있다.

자주 들어가는 복잡한 경로를 변수명에 담아서 쓰기에 좋다.

$변수명 혹은 ${변수명}으로 사용 가능하다.

echo $log 하면 설정된 변수가 어떤 내용인지 출력할 수 있다.

변수를 해제하려면 unset log 하면 사라진다 
env는 시스템 환경 변수 목록 조회
set은 사용자 환경 변수 목록 조회
${HOME}이 대표적인 env 변수 

파일 압축 - tar

tar xfv 파일경로 - 압축풀기
tar cfv 파일경로 - 압축하기

파일명에 날짜 넣기

mv result.txt result-$(date +%y%m%d).txt - 바뀔 파일명에 날짜를 부여한다.

해당 명령어를 변수로 설정해서 ${today}로 사용할 수도 있다. 

쉘 스크립트 - 명령 자동화

명령어 자동화 처리가 가능하다. 로그 출력한다거나 프로덕션을 배포할 때 자동화할 수 있다.

리눅스를 쓰면서 가장 파워풀하고 유용한 기능이다. 이거 하나만으로도 리눅스 명령어를 배울 가치가 있다.

만드는 방법
1. vim setup.sh로 sh 파일을 만든다.
2. #!(셔뱅, 해쉬뱅)을 통해서 스크립트의 시작을 알린다.
3. /bin/bash를 통해 처리해줄 인터프리터를 선택한다.
4. 자동화 할 명령어를 입력한다. 여태 배웠던 명령어를 모두 쓸 수 있다.(cat, grep, less, tail 등)
5. 만들고 나면 chmod +x setup.sh로 권한을 변경해준다.
6. ./setup.sh 혹은 sh setup.sh로 실행하면 된다.

쉘 스크립트 활용하기 1 - 로그 파일 필터링 예제

#!/bin/bash
for ((var=0 ; var < 100 ; var++));
do
if [ $var -eq 31 ] ; then
  echo "Your age is ${age}"
done
echo "완료"

 

일반 프로그래밍처럼 반복문도 사용해서 스크립트를 사용할 수 있다.

 if [ 값1 조건식 값2 ];then
   수행문
 fi

if 사용 형식은 위와 같다. ; 세미콜론이 붙었다고 명령문의 끝 처럼 보이지만 그렇지 않다. if문을 통과하면 then 밑이 수행되고 fi(finish)로 if문을 종료한다.

쉘 스크립트 활용하기 2 - 로그 파일 필터링 예제

#!/bin/bash
args1=$1

if [ $# = 0 ]
then
	echo "no argument"
else
	cd /LOGS/was/tomcat/testServer11
	cat $args1 | grep "Exception" | grep -v "RuntimeException" | sort \
	 | uniq -c | sort -r > ./onlyErrorLog_$(date '+%Y%m%d').txt
	echo "created Success" 
fi

Log 파일에서 Exception을 필터링하고 그 중 Runtime Exception만 제거해서 에러의 중복 개수를 출력해주는 예제다.

대량의 텍스트를 필터링하거나 배포 자동화 스크립트를 만들 때 아주 유용하다.

로그보고 에러 몇개 났는지 하나씩 파악하라는 업무가 들어왔을 때를 대비해 연습해두면 좋다.

스케줄러 - Crontab

* * * * * test.sh

* 부분은 시간을 체크하는 기능이다. 일정 시간마다 스크립트를 실행하고 싶을 때 사용한다.

로그 데이터를 매일매일 필터링해주기에 유용하다.

 

운영체제 백그라운드 - nohup

nohup java -jar test.jar

nohup - no hang up의 줄임말로 끊지않는다 라는 의미의 줄임말로 백그라운드에서 실행되게 만든다. 일반적인 리눅스 프로세스는 SSH 세션이 종료될 경우 백그라운드 여부와 관계 없이 프로세스가 종료된다. nohup을 사용할 경우 ssh 세션이 종료되더라도 프로세스는 실행된다.

보통 쉘스크립트를 통해 jar 파일을 실행할 때 사용한다.

nohup으로 실행될 파일은 항상 755 퍼미션을 가지고 있어야한다.

nohup은 실행을 현재 사용자 세션이 아닌 운영체제가 제공하는 백그라운드 공간에서 실행을 한다. 이런 것을 데몬 형태로 실행한다고 말한다.

 

데몬 - 리눅스 시스템이 처음 가동될 때 실행되는 백그라운드 프로세스의 일종

화면 출력 백그라운드 - &

nohup java -jar test.jar &

&는 사용자 세션에서 실행되며, 화면 출력만 백그라운드로 전환한 상태이다.

 

명령어에 스크립트 사용하기 - awk

 

쉘스크립트에서 사용하던 스크립트 명령문을 리눅스 명령어 내에서도 사용할 수 있다.

awk에서는 특정 행(NR)과 열($)을 선택할 수 있는 기능이 있기 때문에 스크립트의 print 문에서 많이 활용된다.

 

아래는 3행이하의 내용을 출력 한다.

awk 'NR<=3 {print}' input.txt

 

아래는 모든 행의 1열만 출력한다.

awk '{print $1}' input.txt
728x90