Gom3rye 2025. 5. 28. 17:42
728x90

스크립트 실행

  • 셸 스크립트 파일경로: sh 파일 경로를 주면 되는데(dash shell(sh)을 가지고 실행) bash와의 문법 차이때문에 실행이 안되는 경우가 있어서 이 경우에는 bash 파일 경로를 입력해야 한다.
  • 스크립트 파일 경로: 파일에 실행 권한이 있어야 하고 파일이 PATH 경로에 있지 않은 경우에는 현재 디렉토리라도 ./를 추가해서 실행

연산자

-문자열 연산자

  • -z: 문자열의 길이가 0인 경우 참 → 인자가 없으면 참
  • -n: 문자열의 길이가 0이 아닌 경우 참 → 인자가 있어야 참
#!/bin/bash

if [ -z $1 ]
then
        echo True
else
        echo False
fi

-정수 비교 연산자

  • -eq
  • -ne
  • -gt
  • -ge
  • -lt
  • -le
  • , >=, <, <=, ==, !=
    • 크기 비교 연산자는 문자열에도 사용 가능한데 이 때는 기호를 사용해야 한다.
    • → eq, gt, ge 등이 있어도 >, <= 기호가 있는 이유
    • 기호를 사용해서 비교할 때는 [[ 처럼 대괄호를 하나 추가한다.

          → 대괄호를 하나 덜 쓰면 잘못된 값이 나온다!

-논리 연산자

  • -a, &&(기호니까 대괄호 추가)
  • -o, ||(기호니까 대괄호 추가)

-디렉토리 연산자

  • -d: 변수 유형이 디렉토리이면 참
  • -e: 변수 유형이 디렉토리이거나 파일이면 참

-파일 연산자

  • -f: 유형이 파일이면 참
  • -L: 파일이면서 심볼릭 링크이면 참
  • -r: 읽기 권한이 있으면 참
  • -w: 쓰기 권한이 있으면 참
  • -x: 실행 권한이 있으면 참
  • -s: 파일이나 디렉토리이면서 사이즈가 0보다 크면 참
  • -O: 파일이나 디렉토리이면서 스크립트 실행 소유자와 동일하면 참
  • -G: 파일이나 디렉토리이면서 스크립트 실행 그룹과 동일하면 참
    • ex. /etc/localtime 과 /usr/share/zoneinfo/Asia/Seoul 파일을 확인

-파일 비교 연산자

  • -nt: 변수 유형이 파일이면서 변수1이 변수2보다 최신 파일이면 참
  • -ot: 변수 유형이 파일이면서 변수1이 변수2보다 이전 파일이면 참
  • -ef: 변수 유형이 파일이면서 변수1이 변수2과 동일한 파일이면 참
    • 실습
      • first.txt, second.txt 파일 만들기
      • third.txt를 first.txt의 심볼릭 링크로 만들기
      • third.txt가 심볼릭 링크인지 확인하기
      • 만든 파일들을 각각 FILE1, 2, 3의 변수에 넣어주기
      • FILE1이 FILE2보다 최신인지 확인하기
      • FILE1이 FILE2보다 더 먼저 만들어졌는지 확인하기
      • FILE1과 FILE2가 똑같은 파일인지 확인하기
      • FILE1과 FILE3이 똑같은 파일인지 확인하기 (FILE3은 FILE1의 심볼릭 링크니까 똑같은 파일이라고 볼 수 있다.)

정규 표현식

텍스트 탐색과 문자열 조작에 사용되며 하나의 문자와 일치하거나 문자열의 일부분이나 전체 문자열 중 특정 문자 집합을 나타낼 때 사용

-POSIX 기본 및 확장 문법

  • . (점): 줄바꿈을 제외한 한 개의 문자와 일치
  • ?: 자신 앞에 나오는 정규 표현식이 없거나 하나와 일치하며 대부분 한 개의 문자와 매칭할 때 사용
  • *: 한 번 이상 반복되는 문자
  • +: *은 생략될 수 있지만 +는 반드시 한 번 이상 나와야 한다.
  • {N}: 정확히 N번
  • {N,}: N번 이상
  • {N, M}: N에서 M번 일치
  • -: 범위, A-Z는 A부터 Z까지
  • ^: 라인의 시작에서는 공백문자를 의미하고 목록의 경우는 목록에 없는 글자
  • $: 라인의 마지막 공백 문자열
  • ^$: 빈 줄
  • [..]: 문자들의 집합
  • \: 특수 문자를 원래의 문자로 해석
  • \b: 단어 끝의 공백 문자
  • \B: 라인 끝의 공백 문자
  • \<: 단어의 시작에서 공백
  • \>: 단어의 끝에서 공백

-POSIX 문자 클래스

    • [:alnum] : 알파벳이나 숫자 [A-Za-z0-9]
    • [:alpha:] : 알파벳 [A-Za-z]
    • [:blank:] : 스페이스 바나 탭
    • [:contl:] : 제어문자
    • [:digit:] : 숫자 [0-9]
    • [:graph:] : 출력 가능한 그래픽 문자로 ASCII 코드로 33~126
    • [:lower:] : 소문자 [a-z]
    • [:print:] : 출력 가능한 문자 32~126, 스페이스 바가 포함되어 있다.
    • [:punct:] : 문장 부호
    • [:space:] : 뉴라인 줄 바꿈, 스페이스, 탭
    • [:upper:] : 대문자
    • [:xdigit:] : 16진주 숫자와 문자 [0-9a-fA-F]
      • 실습 - expression.txt 파일 만들기
      ======================
      Regular Expression
      ======================
      
      #=======================#
      # Date: 2025-05-28
      # Author: Kyla
      # Description: regular expression test file
      # ======================#
      
      Today is 28-May-2025
      Current time is 11:30
      This is an example file for testing regular expressions.
      This example file includes control characters.
      
      #System Information
      CPU model is Intel(R) core(TM) i7-8665U CPU @ 1.906GHz
      Memory size is 32GiB
      Disk is 512 GB
      IP Address is 192.168.200.11
      
      #Help
      #Do you have any questions? or Do you need any help?
      #If you have any questions, please send a mail to the email below.
      
      #Contacts
      e-mail: itstudy@kakao.com
      phone: 010-3333-3333
      

(참고) grep -E : -E는 확장 정규표현식을 사용하게 해준다.

→ C로 시작하고 U로 끝나는 세 글자를 검색

grep 'C.U' expression.txt

→ c로 시작하고 e로 끝나는 네 글자를 검색

grep 'c..e' expression.txt

→ q로 시작하고 ?로 끝나는 단어여야 하고 q와 ?사이에는 소문자만 존재하는 글자 검색 (?가 특수문자로 인식되지 않도록 \붙여주는 거 주의!)

grep -E 'q[[:lower:]]*\\?' expression.txt

→ #로 시작하는 단어 검색

grep -E '^#' expression.txt

→ 영문 5글자로 시작하고 마지막이 :인 단어 찾기

grep -E '^[[:alpha:]]{5}:' expression.txt

→ 라인을 종료할 때 알파벳 4글자 이상 6글자 이하인 단어가 포함된 라인

grep -E '[[:alpha:]]{4,6}' expression.txt

→ #으로 시작하고 공백인 라인을 제거하고 출력

cat expression.txt | grep -v '^#' | grep -v '^$'

→ .으로 끝나는 단어 찾기 (.도 와일드 카드 글자라는 거 잊지 말고 \넣어주자!)

grep '\\.\\b' expression.txt
#-> ip 빠르게 찾는 것으로 응용할 수 있다.
ip address show | grep '\\.'

→ C로 시작하는 단어가 있는 라인을 검색

grep '\\<C' expression.txt

→ n으로 끝나는 단어가 있는 라인을 검색

grep 'n\\>' expression.txt

→ 특수문자가 포함된 라인을 조회 (ex. 탭)

grep '[[:cntrl:]]' expression.txt

→ 인쇄 가능한 라인만 조회: 빈줄을 제외

grep '[[:graph:]]' expression.txt

→ 인쇄 가능한 라인만 조회: 스페이스만 존재하는 라인도 조회

grep '[[:print:]]' expression.txt

→ 알파벳 6글자 이상이고 문장 부호로 끝나는 단어가 있는 라인만 조회 (문장 부호 → . , ? ;)

grep -E '[[:alpha:]]{6,}[[:punct:]]' expression.txt

공백 제거했는데 나오면 그 안에 스페이스바가 있는 것! -> 공백이 아니다.

-> 정규 표현식으로 찾는 것은 AI에도 많이 사용된다.

많이 사용하는 리눅스 명령어

grep [옵션] 패턴 [파일]

문자열을 찾을 수 있는 명령어

- 옵션

  • -i: 대소문자 구분 없이 조회
    • ex. /etc/fstab 파일에서 uuid를 조회
    grep -i 'uuid' /etc/fstab
    

  • -e: 검색하고자 하는 패턴이 여러 개일 때
    • ex. expression.txt 파일에서 대괄호가 앞뒤에 있는 문자열을 검색
    grep -i -e "^\\[[[:alpha:]]*\\]' expression.txt
    

  • -f: 패턴을 파일에 저장해두고 적용하고자 하는 경우
    • -f 옵션을 여러 번 사용해서 여러 개의 패턴을 적용할 수 있다.
    • 명령어 뒤의 |(파이프)
    cat expression.txt | grep -i '^\\[apple
    

find [대상경로] [표현식]

파일을 검색하기 위한 명령어

  • /etc 디렉토리에서 chrony.conf 파일을 조회
find /etc -name chrony.conf

awk 패턴 {액션}

파일 목록 같은 것을 출력한 후 이를 컬럼에 해당하는 문자열로 추출해주는 명령어

  • 필드와 레코드를 가진 표 형식의 데이터를 추출할 때 매우 유용하다.
  • 레코드가 $0가 되고 $1부터는 필드가 된다.
  • ex. awkexe.txt 파일에서 탭으로 표를 만들고 특정 열만 출력
name    phone           birth           gender  score
reak    010-1111-1111   1870-12-31      M       100
sim     010-2222-2222   1789-05-15      F       80
nara    010-3333-3333   1687-11-10      M       78
yumi    010-4444-4444   1999-06-23      F       59
awk '{ print $1, $2 }' awkexe.txt

  • 검색도 할 수 있다.
awk '/rea/' awkexe.txt

  • 제목도 붙일 수 있다.
awk '{ print ("name: "$1, "," "phone: "$2) }' awkexe.txt

옵션

정보 관련 옵션

  • --help: 도움말
  • -V, --version: 버전

패턴 문법 관련 옵션

  • -E: 확장 정규 표현식에 해당하는 패턴을 검색할 때 사용
  • -F: 여러 줄로 되어 있는 문자열을 검색할 경우 사용
  • -G: 기본 정규 표현식에 해당하는 패턴을 검색할 때 사용되는 옵션으로 기본값
  • -P: Perl 방식의 정규 표현식에 해당하는 패턴을 검색할 때 사용되는 옵션 (최근에는 Pearl이 거의 쓰이지 않아서 예전 문법이라고 생각해도 좋음)

-E 옵션을 사용한 경우와 그렇지 않은 경우

ex. expression.txt 파일에서 q로 시작하고 소문자가 여러 개 나오고 ?로 끝나는 라인을 조회

grep -E 'q[[:lower:]]*\\??' expression.txt

매칭 제어 관련 옵션

  • -e 패턴: 여러 개의 패턴 적용
  • -f 파일: 패턴이 파일에 작성된 경우
  • -i: 대소문자 구분 하지 않음
  • -v: 해당 패턴을 제외하고 검색할 경우
  • -w: 검색하고자 하는 단어가 정확하게 있는 라인만 검색
  • -x: 검색하고자 하는 패턴과 정확하게 일치하는 라인만 검색
  • -y: -i와 동일
    • 실습
      • ex. mail이나 phone 단어를 가진 라인을 조회
      grep 'mail' expression.txt
      grep 'phone' expression.txt
      grep -e 'mail' -e 'phone' expression.txt
      

  • ex. 패턴에 일치하는 라인은 제거해서 조회 (#로 시작하는 라인과 $가 포함된 라인 제거)
cat expression.txt | grep -v '^#' | grep -v '\\$'

  • w 옵션을 이용하면 정확하게 일치하는 데이터만 조회
grep -w 'expression' expression.txt

  • x 옵션을 이용하면 라인 전체가 일치해야 한다.
grep -x 'help' expression.txt

출력 제어 관련 옵션

  • -c: 패턴과 일치하는 단어의 개수를 리턴
  • --color: GREP_COLORS 환경 변수에 의해 정의된 컬러에 맞게 검색한 패턴과 동일한 문자열의 색을 바꿔서 보여줌
  • -L: 패턴과 일치하는 단어가 없는 파일명을 보여줌
  • -l: 패턴과 일치하는 단어가 있는 파일명을 보여줌
  • -m 라인수: 라인 수만큼 보여줌
  • -o: 패턴과 일치하는 단어만 보여줌
  • -q: 패턴과 일치하는 단어가 있든 없든 안 보여줌
  • -s: 존재하지 않거나 읽을 수 없는 파일에 대한 오류 메시지를 안 보여줌
    grep -c 'expression' expression.txt

grep -n 'expression' expression.txt

스크립트 활용

#!/bin/bash
# 명령어를 입력할 때 매개변수 첫 번째와 두 번째 입력이 있는 경우
if [[ -n $1 ]] && [[ -n $2 ]]
then
				# 매개변수를 가지고 배열 생성
        UserList=($1)
        Password=($2)
				# 배열을 순회하면서
        for (( i=0; i<${#UserList[@]}; i++ ))
        do
				        # /etc/passwd에 아이디가 없다는 것을 확인하고
                if [[ $(cat /etc/passwd | grep $UserList[$i] | wc -l) == 0 ]]
                then
					              # 계정 생성하고
                        sudo useradd ${UserList[$i]}
	                      # 계정의 비밀번호 설정하고
                        echo ${Password[$i]} | sudo passwd ${UserList[$i]}
                else
				                # 계정이 존재하면 이미 있다고 메시지 출력
                        echo "this user ${UserList[$i]} is existing"
                fi
        done
# 매개변수가 주어지지 않았을 때 메시지 출력
else
        echo -e 'Please input user id and password.\\nUsage: adduser-script.sh "user01 user02" "pw01 pw02"'
fi

cat /etc/passwd #로 보면 user01, 02, 03 생긴 것을 확인할 수 있다.

시간을 내보내보는 것 -> 스크립트 파일을 만들어서 해볼 것!

 

클라우드 서비스 분류

  • Infra를 빌려감 - OS가 설치된 컴퓨터
    • 이 부분이 제일 많다. → 셸 프로그래밍을 잘 해야 한다.
  • Platform을 빌려감 - 개발 플랫폼
  • Service를 빌려감
728x90
반응형