정규표현식 연속된 문자 검색

프로그래밍/BASH SHELL|2023. 6. 2. 08:16
반응형

시스템 운영을하며 많이 접하는 명령이 grep 이기도 한데 구체적인 문자열 검색을 위해 정규표현식이 사용됩니다.

어떤 행에서 '몇개의 숫자, 점, 몇개의 숫자' 로 이루어진 문자열은 아래와 같이 출력합니다.

 

grep '[0-9]*[.][0-9]*'

 

 

반응형

댓글()

[ShellScript] 로그 파일 실시간 감시 및 마지막행 처리 방법

프로그래밍/BASH SHELL|2023. 3. 29. 10:57
반응형

쉘스크립트 파일을 아래 내용으로 작성하고 실행하면 됩니다.

 

# vi monitor_and_run.sh

#!/bin/bash

FILE="/home/sysdocu/app.log" # 감시할 파일명

# 파일 감시 및 처리
tail -F -n 0 "$FILE" |\
while read line
do
    # 로그에서 특정 문자열 확인 및 처리
    case "$line" in
        *"test"*) # 여기에 일치되는 문자열
            echo 마지막으로 추가된 행 내용 : $line
        ;;
   esac
done

 

* 결과

마지막으로 추가된 행 내용 : 이건 test 입니다.

마지막으로 추가된 행 내용 : lasttest

마지막으로 추가된 행 내용 : test

마지막으로 추가된 행 내용 : test 끝

 

반응형

댓글()

[쉘스크립트] 오래된 백업 파일 삭제하기

프로그래밍/BASH SHELL|2023. 1. 13. 09:31
반응형

백업스크립트로 데이터를 백업할때 디스크용량이 꽉 차는것을 방지하기 위해 보통은 스크립트 상단에 오래된 백업 파일 또는 디렉토리를 삭제하도록 합니다.

하지만 오래된 디렉토리를 삭제할 경우 그 안의 내용은 지워지지만 디렉토리 자체는 날짜가 갱신되어 (Access, Modify, Change) 삭제가 되지 않습니다.

이 경우 아래와 같이 조치가 가능합니다.

 

예) 20 으로 시작되는 날짜 디렉토리 중 30일이 초과된 디렉토리 삭제

 

1) 기존 방법

명령 : find /backup/20* -ctime +30 -exec rm -rf {} \;

결과 : 날짜가 오래된 디렉토리 내 파일은 삭제되지만 디렉토리는 남게됩니다.

 

2) 새 방법

디렉토리의 변경되지 않는 Birth 날짜와 현재 날짜를 비교하여 삭제

cd /backup
LIST=`stat -c %n" "%w 20* |sed -e 's/-//g' |awk {'print $1" "$2'}`
while read i j; do # i : Directory name, j : Birth date
    if [ $j -le `date +%Y%m%d --date '30 days ago'` ]; then
        rm -rf $i
    fi;
done <<< "$LIST"

 

* 참고

파일 또는 디렉토리의 날짜 확인

# stat 20230102
  File: 20230102
  Size: 30         Blocks: 0          IO Block: 4096   디렉토리
Device: 821h/2081d Inode: 1799764911  Links: 4
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2023-01-11 12:00:01.478938107 +0900
Modify: 2023-01-02 12:00:02.236334564 +0900
Change: 2023-01-02 12:00:02.236334564 +0900
 Birth: 2023-01-02 00:00:01.354856557 +0900

 

반응형

댓글()

쉘스크립트 rsync 실행시 끝에 \#015 문자가 붙는 경우 조치방법

프로그래밍/BASH SHELL|2023. 1. 11. 14:44
반응형

파일 리스트 등의 결과를 변수에 넣고 rsync 로 한줄씩 사용하고자 할때 아래와 같은 현상이 발생되었습니다.

이밖에 다른 경우에도 같은 현상이 나타날 수 있는데, 이때 해결방법은 아래와 같습니다.

 

방법1)

리스트가 list.txt 에 있는 경우 개행문자를 제거하고

list_new.txt 라는 새로운 파일에 입력합니다.

 

# tr -d '\r' < list.txt > list_new.txt

 

방법2)

sed -i 's/^M//' list.txt

 

여기에서 ^M 은 ctrl 키를 누른 상태에서 v, m 을 순서대로 누르는 것입니다.

(ctrl + v + m)

 

반응형

댓글()

[Shell Script] MySQL 테이블 별로 백업 하기

프로그래밍/BASH SHELL|2022. 9. 8. 08:17
반응형

쉘스크립트를 이용하여 모든 데이터베이스를 테이블 별로 백업하는 방법 입니다.

파일명은 {DB명}.{테이블명}.sql 형식으로 남게 됩니다.

 

# vi mysql_backup_by_table.sh

 

#!/bin/bash

today=`date +%Y%m%d`

# 백업 디렉토리
mkdir -p /backup/${today}
cd /backup/${today}

# MySQL root 패스워드
root_pw='12345678'

# 1) 모든 DB 백업
list=`echo "show databases;" |mysql -uroot -p"$root_pw"`

# 2) 선택한 DB 만 백업 (개행 \n 으로 구분)
#list=`echo -e "mysql\nmonitor\nsysdocu"`

for db in $list;
do
    table_list=`echo "show tables" |mysql -uroot -p"$root_pw" $db`
    for table in $table_list;
    do
        mysqldump -uroot -p"$root_pw" $db $table > ${db}.${table}.sql
        #tar cvzf ${db}.${table}.tar.gz ${db}.${table}.sql --remove-files # 압축 보관 및 원본 삭제
    done
done

 

# chmod 700 mysql_backup_by_table.sh

 

실행

# sh mysql_backup_by_table.sh

 

 

반응형

댓글()

쉘스크립트 수 비교하기

프로그래밍/BASH SHELL|2021. 6. 10. 11:34
반응형

기본 예제

#!/bin/bash

Boy="160"
Girl="158"

if [ "${Boy}" -gt "${Girl}" ]; then
        echo "소년이 더 큽니다. "
elif [ "${Boy}" -lt "${Girl}" ]; then
        echo "소녀가 더 큽니다. "
else

        echo "소년과 소녀가 같습니다."
fi

 

비교 연산자

A -lt B : A가 B보다 작습니다.
-le : 작거나 같습니다.

-gt : 큽니다.
-ge : 크거나 같습니다.
-eq : 같습니다.
-ne : 다릅니다.

 

반응형

댓글()

파일과 현재시간의 timestamp 구하기, 차이 계산하기

프로그래밍/BASH SHELL|2021. 3. 26. 08:06
반응형

특정 파일이 쓰여진 날짜의 timestamp 를 time_close 변수에 기록합니다.

time_close=`stat -c %Y /var/spool/mail/sysdocu`

 

현재시간 timestamp 를 time_now 변수에 기록합니다.

time_now=`date +%s`

 

두 값의 차이를 계산 합니다. (초)
time_diff=`expr $time_now - $time_close`

 

계산된 값을 출력합니다.

echo $time_diff

 

 

반응형

댓글()

쉘스크립트에서 특정시간의 전 후 시간 계산 하기

프로그래밍/BASH SHELL|2020. 11. 4. 09:30
반응형

아래는 현재 시간에서 5분전 시간을 출력합니다. now_time 변수에 특정 날짜, 시간을 넣으면 그 시간에서 부터 계산합니다.


now_time=`date +%Y-%m-d %H:%M:%S`

edit_time=`date -d "${now_time} 5 minute ago"`


echo $edit_time


[ 결과 ]


# echo $edit_time

Wed 04 Nov 2020 09:22:19 AM KST  // 5분 전 시간


# date

Wed 04 Nov 2020 09:27:22 AM KST  // 현재 시간



분 외에 시간이나 초, 날짜 등 전후의 시간계산을 원하시는 분은 아래 링크를 참조하여 진행하시면 됩니다.

정리가 잘 되어 있습니다.


https://soft.plusblog.co.kr/97


반응형

댓글()

소수점 두자리에서 자르기, 소수점 세자리에서 반올림하기

프로그래밍/BASH SHELL|2020. 6. 25. 12:18
반응형

1. 자르기


[ 명령 ]

# echo "scale=2;1.16628996273/1" |bc -l


[ 결과 ]

1.16


여기에서 scale=2 부분이 소수점 두 자리까지 출력을 한다는 의미 입니다.

그리고 1.16628996273/1 는 계산 식인데, 숫자만으로 표현하면 처리가 되지 않으니

꼭 계산식으로 해야 해서 나누기 1을 해준 것입니다.



2. 반올림 하기


[ 명령 ]

# echo $(printf %.2f 1.16628996273)


[ 결과 ]

1.17



반응형

댓글()

파일을 첫번째 필드를 기준으로 중복제거하여 전체필드 출력하기

프로그래밍/BASH SHELL|2020. 6. 25. 10:43
반응형

[출처] https://m.blog.naver.com/PostView.nhn?blogId=nativekim&logNo=220376409687


유닉스, 리눅스에서도 파일을 중복제거하는 기능이 있다.

 

보통 sort한후 uniq 명령어로 중복제거를 하는 방법은 많이 알고 있지만 첫번째 필드를 기준으로 중복제거를 하고

 

출력은 모두 필드가 나오도록 하는건 모르는 사람이 많다.

 

명령어의 옵션을 활용을 하면 이런 작업을 할수가 있다.

 

다음과 같은 내용의 a.txt 파일 있다.

 # cat > a.txt
11 aa xtp1
11 ab xtp2
11 ac xtp4
11 ad xtp4
11 af xtp2
22 bb xtp5
22 bp xtp5
22 bs xtp1

 

리눅스에서 uniq 옵션중에 -w 옵션이 있다. 처음부터 몇바이트가 중복기준으로 삼을건지.. -w 2 옵션을 쓰면 2바이트만 기준으로

중복을 제거한다.

cat a.txt | sort | uniq -w 2

결과

11 aa xtp1
22 bb xtp5

 

리눅스에서는 uniq옵션에 -w 옵션이 존재하지만 uniq에는 존재하지 않는것 같다. (확실치는 않음.. 모두 테스트못했음--;)

그래서 awk 구문을 이용하여 첫번째 필드를 기준으로 중복제거한후 uniq하게 모든 필드가 나오도록 로직을 만들어봤다.

 

cat a.txt |sort | awk '{if($1 != tmp1) { {tmp1 = $1} print $0 }} '

결과)

11 aa xtp1
22 bb xtp5

 

 다른 방법으로는

 

 cat a.txt |awk '!a[$1]++'

 

첫번째와 두번째필드를 모두 기준으로 하고 싶다면 다음과 같이 하면 된다.

 

 cat a.txt |awk '!a[$1,$2]++'

 

알아두면 좋을 옵션은 uniq -u 와 uniq -d 이다.

-u는 유닉스한 데이터만 출력하고 -d 는 유닉스하지 않은 데이터를 출력한다.

 

# cat > b.txt
uniq option -u check!

uniq option -d check!

uniq option -d check!

uniq option -d check!

 

전체중에 uniq한 데이터만 출력

 cat b.txt | sort | uniq -u

uniq option -u check!

 

전체중에 중복이 있는것만 출력(출력할때 uniq하게 출력됨)

 cat b.txt | sort | uniq -d

uniq option -d check!



[출처] https://m.blog.naver.com/PostView.nhn?blogId=nativekim&logNo=220376409687


반응형

댓글()

bash shell 에서 mongodb 읽고 쓰기

프로그래밍/BASH SHELL|2020. 5. 13. 16:37
반응형

1. 입력


# mongo -u packet -p 12345678 --host 127.0.0.1 --port 27017 --authenticationDatabase packet --eval 'db.logs.insert({"date" : "2020-05-05 11:22:33", "body" : "eee"})'

MongoDB shell version v3.4.24

connecting to: mongodb://127.0.0.1:27017/

MongoDB server version: 3.4.24

WriteResult({ "nInserted" : 1 })


[설명]

- packet : 계정

- 12345678 : 계정 비밀번호

- 127.0.0.1 : MongoDB 서버 IP

- 27017 : MongoDB Listening 포트

- logs : Collections (테이블 부분)

- { 부터 } 까지 : Documents (데이터 부분)



2. 조회


# mongo -u packet -p 12345678 --host 127.0.0.1 --port 27017 --authenticationDatabase packet --eval 'db.logs.find()'

{ "_id" : ObjectId("5ebb9ff124bd96fec20b5ff0"), "date" : "2020-05-05 11:22:33", "body" : "eee" }


반응형

댓글()