본문으로 바로가기

리눅스(Linux) 명령어 학습 - (2)

category 인프라/리눅스 2019. 5. 7. 17:05

글을 앞서

 

해당 글은 '만화로 배우는 리눅스 시스템 관리' 1권을 정리하는 글로, 앞으로 2권도 읽게 되면 추가로 내용을 채워갈 예정입니다.

 

# 앞 선 포스팅도 읽어주세요~

https://brenden.tistory.com/85

 

리눅스(Linux) 명령어 학습 - (1)

글을 앞서 이동욱님 블로그를 보다가 '만화로 배우는 리눅스 시스템 관리' 책을 알게 되어 이 책을 통해 리눅스를 공부하겠다 싶었습니다. (https://jojoldu.tistory.com/36?category=717427) 해당 글은 '만화로..

brenden.tistory.com

 
13화 [파이프라인] 로그 파일에서 필요한 줄만 뽑고 싶어

  1. 파이프라인(|)을 통해 명령어 양쪽을 연결해서 사용
  2. 가공하는 작업을 진행할 때 자주 사용된다.
    1. 파일 내용을 다음 명령어에 출력하는 시작 그룹 :  cat, zcat, xzcat, tail -F
    2. 중간에서 이전 명령어 출력을 가공하는 중간 그룹 : grep, sort, cut, uniq, sed, awk
    3. 이전 명령어 출력을 가공하는 최종 그룹 : less, tee, wc, head
1
2
3
4
5
# grep 옵션 (-v, 해당 문자열을 포함하지 않은 줄 출력 | -r, 재귀적으로 호출)
# grep <찾을 내용> <대상 파일 및 디렉토리>
 
grep "brenden" /home/brenden | grep -"/live" | less
zcat brednen.log.gz | grep "brenden" | grep -"/live" | less
 

 

 

14화 [셸 스크립트] 작업 절차를 자동화하고 싶어


  1. 셸 스크립트 : 셸 작업을 자동화하도록 만든 각본 (명령어 실행 절차)
  2. 셔뱅 : Hash-Bang이라고 하고, '#!/bin/bash' 와 같이 스크립트를 실행하는 인터프리터를 지정하는 구문
  3. 'chmod +x setup.sh' : 실행권한을 설정해야된다
  4. /bin/ or /usr/bin/ 장소 외에는 실행하려는 경로를 모두 작성해 주어야 된다
  5. 명령어 이상이 있을 경우, 스크립트 실행을 중단하고 싶을 때
    • 기존 셸과는 별도의 스크립트 실행용 프로세스가 생겨서 exit하는 것이기 때문에 아래 코드가 정상적이다~
1
2
# 이전 명령어가 정상 종료했는지 확인 // 이상종료했을 경우 스크립트 실행을 중단
if [ $? != 0 ]; then exit; fi 
cs

 

 

15화 [셸 변수] 같은 문자열을 스크립트에서 재사용하고 싶어


  1. 일괄수정
    • %s/원문/수정문/
  2. 변수
    • ${변수명} or $변수 로 참조하여 쓸 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 예제1) 실행 옵션등도 변수로 지정 가능, eval을 통해 문자열로 명령어열로 실행 가능
 
extract="tar xfv"
compress="tar cfv"
 
eval "$extract file.tar.gz"
eval "$compress directory"
 
# 예제2) 숫자도 변수로
 
days=30
 
# 예제3) 디렉토리 경로도 분할
 
base=/a/b/c
latest=${base}/d/e
 
cs

 

 

16화 [환경 변수] 작업 환경과 상태를 정해서 스크립트를 실행하고 싶어


  1. 환경 변수를 사용하면 셸 스크립트를 실행 시 값이 변하므로 환경에 맞는 처리가 가능하다.
  2. 명령어 치환 : $(명령어열) or  '명령어열'이라고 적으면 명령어열 실행 결과를 문자열로 적는 것과 같아진다.
    1. 파이프라인이나 변수 등도 명령어 치환에서 사용 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 환경변수 확인
env
 
# 자주 사용하는 환경변수
HOME : 홈 디렉토리 경로
PWD : 현재 디렉토리 경로
EDITOR : vim, nano 등
PAGER : less, lv 등
USER : 현재 사용자의 사용자명
GROUP : 현재 사용자의 그룹명
HOSTNAME : 머신의 호스트명
 
# 명령어 치환
today = $(date +%Y - %m - %d)
grandparent = $(dirname $(dirname $path))
 
cs

 

 

20화 [명령줄 인수] 명령줄 지정으로 작업 내용을 바꾸고 싶어


  1.  아래와 같은 예시로 같이 확인해요~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# $1, $2, $3 인수를 사용하는 방법
 
#!/bin/bash
source=$1
target=$2
 
 
./example.sh -s source -t target
 
#!/bin/bash
while getopts s:t: OPT
do
    case $OPT in
        s) source="$OPTARG" ;;
        t) target="OPTARG" ;;
    esac
done
cs

 

 

21화 [if (조건분기)] 조건에 따라 처리 흐름을 바꾸고 싶어


  1. 조건 분기를 할 때 사용하며, 아래 예제를 보기고 같이 적용해봐요!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1번 예)
if [ $# = 1 ]
then
    echo "인수는 1개"
else
    echo "인수가 1개가 아닐 때"
fi
 
 
# 2번 예)
if [조건]
then
    echo "조건을 만족할 "
fi
">cs

 

 

22화 [종료 상태] 명령어 이상 종료에 대응하고 싶어


  1. '$?' : 바로 전에 실행한 명령어의 종료 상태
    1. 정상 종료하면 0, 그 외에는 0 이외의 값
    2. exit 1 처럼 작성해 주면 셸 스크립트가 종료 상태가 된다.
    3. 0~255까지 종료상태 코드가 있다.
  2. 줄바꿈 대신 ';'을 쓰면 한 줄로 합칠 수 있다.

 

 

23화 [for] 같은 처리를 반복해서 실행하고 싶어


  1. for 반복문을 사용하면 값 리스트에 따라 같은 처리를 반복 가능
  2. 반복문에서 사용하는 값 리스트로 변수나 명령어 치환 결과도 가능
    • 아래 예시1~ 예시4는 다 같은 의미를 가지는 표현이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 예시 1)
for filename in a.log b.log c.log d.log e.log
do
    ./create-example.sh $filename
done
 
# 예시 2)
for filename in a.log \
                b.log \ 
                 c.log \
                d.log \
                e.log
do
    ./create-example.sh $filename
done
 
# 예시 3)
files="a.log b.log c.log d.log e.log"
for filename in $files
do
    ./create-example.sh $filename
done
 
 
# 예시 4)
for filename in $(cd /var/log; ls *.log | grep -error.log )
do
    ./create-example.sh $filename
done
 
cs

 

 

24화 [셸 함수] 공통 처리를 계속 재사용하고 싶어


  1. 어떤 처리를 하나로 묶어서 함수로 정의 가능
  2. 함수도 인수를 사용 가능
  3. 함수 실행을 중단하고 원래 처리로 돌아갈 때는 exit이 아니라 return 을 사용
  4. main함수를 작성해주고 역할에 대한 추상화를 함수를 통해서 제공받을 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
 
main() {
    today
    copy //B
}
 
today() {
    date +%Y - %m - $d
}
 
copy() {
    source=$1
    target=$2
    cp $source $target
    echo "복사 처리 완료"
}
 
main
cs

 

'인프라 > 리눅스' 카테고리의 다른 글

리눅스(Linux) 명령어 학습 - (2)  (0) 2019.05.07
리눅스(Linux) 명령어 학습 - (1)  (3) 2019.04.27

댓글을 달아 주세요