'스크립트'에 해당되는 글 13건

  1. 2011.09.19 파일 사이즈가 0 인 개수 확인 스크립트
  2. 2010.05.25 파일비교 스크립트 5 2
  3. 2010.04.22 파일들의 확장자만 변경
  4. 2009.11.05 13. 파일 비교 스크립트 4 2
  5. 2009.10.21 12. 파일 개수 비교해서 삭제하는 스크립트 3
  6. 2009.09.19 11. SSH 접속 차단 스크립트 ( 5번 패스워드 틀리면 자동 차단) 2
  7. 2009.09.18 10. 파일비교 스크립트2 3
  8. 2009.09.10 9. 여러 파일 하나의 txt 파일로 합치기 스크립트 3
  9. 2009.09.10 8. 파일 내용 비교1 3
  10. 2009.06.01 스크립트 문제
  11. 2009.03.31 7. sed 란? 2
  12. 2009.03.05 5. 날짜표시 (date)
  13. 2009.03.04 4. 기본 루프문 (while)
2011. 9. 19. 22:23

파일 사이즈가 0 인 개수 확인 스크립트

1. 현재 디렉토리 내에서 파일사이즈가 0 가 아닌 파일의 개수를 확인하는 쉘 스크립트 

#!/bin/bash


ls -l | grep '^-' | awk '{print $9}' > imsy


CNT=0


for i in `cat imsy`

do

        if [ -s $i ]

        then

                CNT=`expr $CNT + 1`


        else

                shift

        fi

done

echo $CNT
rm -rf ./imsy 


 
마지막에 출력되는 CNT 변수가 현재 디렉토리 내의 파일 사이즈가 0 보다 큰 파일들의 개수임.

2. 반대로 파일사이즈가 0 인 것들의 개수를 구하는 스크립트

#!/bin/bash


ls -l | grep '^-' | awk '{print $9}' > imsy


CNT=0


for i in `cat imsy`

do

        if [ -s $i ]

        then

shift

        else

            CNT=`expr $CNT + 1`


        fi

done

echo $CNT
rm -rf ./imsy 

 
2010. 5. 25. 00:31

파일비교 스크립트 5

a.txt 에는 원본 파일로 대용량 파일
b.txt 에는 부분 파일

a.txt 에 있는 내용중에 b.txt 파일에 있는 내용이 포함되어 있는 라인만 뽑아내는 스크립트

#!/bin/bash
dir=$PWD

for mdn in `cat $dir/b.txt | awk -F, '{print $1}'`
do
      grep  $mdn $dir/a.txt >> $dir/tmp.txt
done

결과는 tmp.txt 라는 파일에 저장된다.


최종 파일 비교 스크립트 -> http://darkrang.tistory.com/219



2010. 4. 22. 14:20

파일들의 확장자만 변경

현재 디렉토리의 TXT 라는 확장자를 가진 파일들이 있고,
이것들을 모두 JPEG 라는 확장자로 변경하고 싶다면

간단한 쉘스크립트로 변경이 가능하다.

우선 test.sh 라는 스크립트를 아래의 내용으로 만든다.

#!/bin/sh
for f in *.${1}; do mv "$f" "${f%${1}}${2}"; done


실행할 때에는 test.sh txt jpeg 라고 수행을 해야 한다.
우선 chmod +x 명령어로 test.sh 에 실행권한을 주고
아래와 같이 수행한다.
chmod +x test.sh
./test.sh txt jpeg

아래는 수행되는 모든 과정을 보여준다.
[si@localhost 100422]$ ls -l
합계 4
-rw-rw-r-- 1 si si  0  4월 22 14:05 1.txt
-rw-rw-r-- 1 si si  0  4월 22 14:05 2.txt
-rw-rw-r-- 1 si si  0  4월 22 14:05 3.txt
-rwxrwxr-x 1 si si 61  4월 22 14:14 test.sh
[si@localhost 100422]$
[si@localhost 100422]$ ./test.sh txt jpeg
[si@localhost 100422]$ ls -l
합계 4
-rw-rw-r-- 1 si si  0  4월 22 14:05 1.jpeg
-rw-rw-r-- 1 si si  0  4월 22 14:05 2.jpeg
-rw-rw-r-- 1 si si  0  4월 22 14:05 3.jpeg
-rwxrwxr-x 1 si si 61  4월 22 14:14 test.sh

2009. 11. 5. 21:31

13. 파일 비교 스크립트 4

원본 파일(a.txt)에서  특정한 파일의 숫자들(b.txt) 을 뺀 나머지 라인들을 구하는 것

우선 원본 파일 변경되므로 원본파일은 다른 이름으로 변경시켜 놓는다.
#!/bin/bash
dir=$PWD
count=0
cp $dir/a.txt $dir/a.txt_org

for mdn in `cat $dir/b.txt | awk -F, '{print $1}'`
do
      sed -e "/"$mdn"/d" $dir/a.txt > $dir/imsy.txt
      cat $dir/imsy.txt > $dir/a.txt
      count=`expr $count + 1`
done
echo "count is =" $count

rm $dir/imsy.txt
작업할 디렉토리 지정
반복문이 몇번 실행되었는지 체크하기 위한 count 변수 지정
원본 a.txt 파일을 a.txt_org 으로 백업한다.

(2) for mdn in `cat /home/bjh/homepcssn/test/b.txt | awk -F, '{print $1}'`
for 반복문을 사용
mdn 이란 변수에 b.txt 파일에서 숫자가 있는 필드만 awk 로 골라내어서 for 문을 사용해 차례로 입력하도록 한다
( 나중에는 cat 부분만 변경해서 사용 / 숫자만 있는 파일이면 cat 만 써도 됨 )
awk 에서 -F 옵션은 구분자를 지정할때 사용 ( 지정하지 않으면 빈칸으로 필드 구분 )
즉 쉼표(,) 로 구분했을때 첫번째 필드가 숫자가 되기 때문에 사용
여기서 $mdn 이란 변수에는 숫자(전화번호) 만 들어간다

(3) sed -e "/"$mdn"/d" $dir/aa.txt > $dir/imsy.txt
변수 mdn이 포함된 라인만 지운 나머지 모든 라인을 임시파일 imsy.txt 파일에 저장한다.

(4) cat imsy.txt > a.txt
임시파일을 원본 a.txt 에 덮어쓴다
이때 첫번재 mdn 값을 제외한 모든 라인이 a.txt 에 덮어쓴다.

(5) count=`expr $count + 1`
반복문이 1번 반복될때마다 count 변수는 하나씩 증가한다.

(6) done
mdn 변수의 개수만큼 돌아가고 나서 반복문 종료

(7) echo "count is =" $count
반복문이 몇번 실행되었는지 확인
즉 mdn 변수가 몇번 변했는지도 알 수 있다.
즉 b.txt 에서 숫자가 몇라인이 들어있는지 알 수 있다

(8) rm $dir/imsy.txt
임시파일 삭제




최종 파일 비교 스크립트 -> http://darkrang.tistory.com/219


2009. 10. 21. 17:12

12. 파일 개수 비교해서 삭제하는 스크립트

같은 디렉토리에 쌓이는 파일 개수를 count 해서 특정한 값
이상이 되면 예전 파일 부터 삭제하는 스크립트


#!/bin/bash
DIR=$PWD
ls -l | grep PFX_COUNT | wc -l > A.txt
A=`cat $DIR/A.txt`
echo $A

if [ $A -lt 3 ]
then
echo "Count is low"
else
echo "Count is high"
        ls -lt | grep PFX_COUNT > $DIR/imsy.txt
        sed '1,3d' $DIR/imsy.txt | awk '{print $9}' > $DIR/imsy2.txt
        cat $DIR/imsy2.txt
                for test in `cat $DIR/imsy2.txt`
                do
                rm -rf $test
                done
fi
rm -rf $DIR/imsy.txt
rm -rf $DIR/imsy2.txt
rm -rf $DIR/A.txt

(1) ls -l | grep PFX_COUNT | wc -l > A.txt 

DIR 위치에 있는 파일들 중에서 PFX_COUNT 란 이름을 가진 파일들의 개수를 A.txt 에 저장

(2) A=`cat $DIR/A.txt`
A라는 변수에 그 개수를 저장

(3) if [ $A -lt 3 ]
만약 그 값이 3 보다 작다면 바로 아래 라인으로 이동해서 그 다음 명령 수행
만약 3보다 크면 else 밑의 명령들을 수행

(4)         ls -lt | grep PFX_COUNT > $DIR/imsy.txt
        sed '1,3d' $DIR/imsy.txt | awk '{print $9}' > $DIR/imsy2.txt
        cat $DIR/imsy2.txt

PFX_COUNT 가 포함된 파일의 리스트를 imsy2.txt 에 저장

(5)            for test in `cat $DIR/imsy2.txt`
                do
                rm -rf $test
                done

for 문으로 돌리면서 삭제해준다.

(6) 기타 임시txt 파일들을 삭제함


2009. 9. 19. 15:27

11. SSH 접속 차단 스크립트 ( 5번 패스워드 틀리면 자동 차단)

      1 #!/bin/bash
      2 days=`date +%d`
      3 savedir='/z_bjh/denylist'
      4 for i in $( cat /var/log/secure | grep "Failed password for" | awk '$2 = $days {print $13}' | sort | uniq -c | awk '$1 > 5 {print $2}'); do
      5 denyip=${i#::ffff:}
      6 echo "ALL:$denyip" >> $savedir
      7 done
      8 for a in $( cat /etc/hosts.deny | grep "ALL : " | awk '{print $3}' | sort | uniq -c | awk '{print $2}'); do
      9 echo "ALL : $a" >> $savedir
     10 done
     11 cp /etc/hosts.deny-before /etc/hosts.deny
     12 for b in $( cat $savedir | grep "ALL : " | awk '{print $3}' | sort | uniq -c | awk '{print $2}'); do
     13 echo "ALL : $b" >> /etc/hosts.deny
     14 done
     15 cat $savedir >> /etc/hosts.deny
     16 rm -f $savedir


일단 이 스크립트를 작성하기 전에 한가지ㄱㅏ 필요하다

/etc/hosts.deny 를  /etc/hosts.deny-before 라고 하나 복사해야한다.

그리고 /z_bjh/denylist 라는 파일을 하나 만들어주어야 한다.( 디렉토리는 마음대로 수정 )

하도 예전에 인터넷 여기저기 보고 만들어놓은 것인지라 .

위에서는 라인번호를 같이 표시했다. ( 왜냐하면 저걸 그대로 복사하면 라인이 바뀌게 되고 그럼 스크립트가 실행이 안되므로 ㅋㅋ )

원리는 간단하다 /var/log/secure 파일을 읽어서 접속 Fail 메시지를 count 해서 그 아이피만 추출하여
/etc/hosts.deny 에 등록해주는 것이다.

상용서버에도 돌려봤는데 정말 리눅스 해킹시도는 엄청나다.

이걸 사용하든지 아예 /etc/hosts.deny 에 ALL:ALL 로 해놓고 접속하는 곳의 아이피를 /etc/hosts.allow 에
등록시켜 놓고 사용하는게 편하다 ^^ㅋ


(1) 실사용방법은 위의 스크립트를 deny_ip.sh 라고 작성하여 만들고
(2) /etc/hosts.deny 를 복사하여 /etc/hosts.deny_defore 라고 하나 만들어주고
(3) touch /z_bjh/denylist 라고 하나 만들어줌

사용되다가 실제로 5번이 틀리면 자동으로 /etc/hosts.deny 에 아이피가 등록되고 접속이 아예할 수 없게 된다.
5분마다 /var/log/secure 파일을 검색해서 다시 추가해준다.
만약 secure 파일이 지나가버려서 새로운 secure 파일로 생성될 때에는
초기화가 된다.


2009. 9. 18. 13:57

10. 파일비교 스크립트2

이번에는 두개의 파일이 있고
A 라는 파일은 원본 파일로 데이터량이 많다
B 라는 파일은 A보단 양이 적다.

원하는 것은 A 에서 B 를 제외한 나머지의 데이터를 알고 싶다.


#!/bin/bash
A=/user1/si/z_bjh/a.txt
B=/user1/si/z_bjh/b.txt
sdiff $A $B > c.txt
sed -n "/</p" c.txt | awk '{print $1}' > d.txt


sdiff 라는 것은 아래와 같이 동작한다.

두 텍스트 파일을 동시에 같이 보면서 그 차이점을 살펴보려면, 다음과 같이 합니다.

   sdiff file1 file2

sdiff 명령은 두 파일을 각각 한 줄씩 서로 비교해 가면서, 두 파일의 내용을 모두 출력합니다.

그 줄이 서로 다른 경우는 | 기호, file1에만 있는 경우는 < 기호, file2에만 있는 경우는 > 기호, 두 줄이 서로 똑 같은 경우는 아무것도 없습니다



예를 들어 a.txt 에 1부터 8까지 넣고  b.txt 에 1부터 4까지 넣었다면 아래와 같이 나온다.
오른쪽의 < 표시는 a.txt 에는 존재하고 b.txt 에는 존재하지 않는 것이다.

sdiff a.txt b.txt
1                                                               1
2                                                               2
3                                                               3
4                                                               4
5                                                             <
6                                                             <
7                                                             <
8                                                             <




최종 파일 비교 스크립트 -> http://darkrang.tistory.com/219

2009. 9. 10. 12:10

9. 여러 파일 하나의 txt 파일로 합치기 스크립트

#!/bin/bash
DIR="/user1/si/z_bjh/icms_data/"

A=`ls -l $DIR | awk '{print $9}'`

for i in `echo $A`
do
cat $DIR$i >> /user1/si/z_bjh/aa.txt
done

#echo "===== DONE !! ======="


먼저 하나로 합칠 여러개의 파일들을 하나의 디렉토리에 넣는다

/user1/si/z_bjh/icms_data  에 모두 넣고

변수 A 에   ls -l $DIR | awk '{print $9}'  명령을 통해서 파일명만 추출해서 넣음

 for 반복문으로
변수 i 에다가 변수A 가 계속적으로 반복되면서 하나씩 차례로 파일명을 넣을 것이고

cat $DIR$i >> /user1/si/z_bjh/aa.txt

aa.txt 라는 파일에 리다이렉트로  모든 파일의 내용을 계속적으로 넣는다.


------------

가장 쉬운 방법은 a.txt 와 b.txt 라는 두 개의 파일 있을 때

다음과 같이 리다이렉트를 사용해서 두개를 하나의 파일로 합치면 됩니다.

cat a.txt >> imsy.txt
cat b.txt >> imsy.txt

그런 다음에 중복된 것을 제거 하기 위해서 sort -u imsy.txt > imsy2.txt 라고 하면

마지막에 imsy2.txt 라는 파일 최종적으로 나오게 된다 ^^

참고로 필드별로 sort 하는 방법은 이전 글에 적어놓았음 --> [내가쓰는리눅스 강좌] - 25. sort 명령어




2009. 9. 10. 11:10

8. 파일 내용 비교1


mdn 이란 변수에 전화번호 9천개가 들어있는 파일로 cat 으로 일일이 하나씩 불러오게 함

#!/bin/bash
dir=/user1/si/z_bjh
for mdn in `cat /user1/si/z_bjh/icms_err`
do
sed -n "/"$mdn"/p" $dir/b.txt >> $dir/c.txt
done

그런다음에 b.txt 에 있는 내용중에서  mdn 변수에 있는 전화번호가 있는 라인만 sed 로 뽑아서 c.txt 에 저장하는 것


참고로 필요한 mdn 번호만 정리하기 위해서 cut -c 옵션으로 문자열의 수만 따로 뽑음
물론 awk 를 사용할 수도 있지만 구분필드가 명확하지 않아서 ㅡㅡㅋ

cut -c 21-31 c.txt >> d.txt

21번째 문자부터 31번째 문자까지만 뽑아서 d.txt 에 저장




최종 파일 비교 스크립트 -> http://darkrang.tistory.com/219




2009. 6. 1. 17:53

스크립트 문제

로그 파일의 문제
생성시에 길어진 라인은 짤려서 다음 라인으로 생성이 된다.!!
다음 라인으로 저장된 라인을 다시 바로 위의 라인의 끝으로 붙여넣기 할려는 목적 !!

두개의 라인이 모두 그런 패턴을 보이는 경우가 있음 !!

특정 패턴
다음 라인으로 짤려서 내려간 것은 빈칸 (스페이스) 가 10개 이상으로 연속되어 구분하기 쉽다.

위의 문제를 해결해서 새로운 파일로 저장해야 함!

예시 로그 ( 라인번호와 함께 표시 )
  1 18:16:27.140 CALL(225) (01:14985:00) SENT L4 RTR DIP W/MEDIA PARAM ID:  771 to
  2                        L4
  3 18:16:27.140 CALL(L4)  (01:14985:00) RCVD Route Control from H323
  4 18:16:27.140 CALL(L4)  (01:14985:00) Accessing IP Bearer Profiles
  5 18:16:27.140 CALL(L4)  (01:14985:00) Profile Id 3 (RG 771)
  6 18:16:27.140 CALL(L4)  (01:14985:00) SENT Route Control Ack to H323
  7 18:16:27.140 CALL(225) (01:14985:00) RCVD (2)Route Control Ack from L4
  8 18:16:27.140 CALL(225) (01:14985:00) H245 Tunneling Set in Incoming Setup
  9 18:16:27.140 CALL(225) (01:14985:00) Accepted H245 Tunneling
 10 18:16:27.140 CALL(225) (01:14985:00) Incoming SETUP has fastStart present
 11 18:16:27.140 CALL(225) (01:14985:00) Accepted FastStart Proposal - g729(20)
 12 18:16:27.140 CALL(225) (01:14985:00) Remote Fwd Log Chan Codecs:
 13 18:16:27.140 CALL(225) (01:14985:00) g723.1(30) g729(20) nonStandard g723.1(30)
 14                         g729B(20) g711A64k(20) g711U64k(20)
 15 18:16:27.140 CALL(225) (01:14985:00) Remote Rev Log Chan Codecs:
 16 18:16:27.140 CALL(225) (01:14985:00) g723.1(30) g729(20) nonStandard g723.1(30)
 17                         g729B(20) g711A64k(20) g711U64k(20)
 18 18:16:27.140 CALL(225) (01:14985:00) Local Codecs: g711U(10,30,30) g711A_64(10,
 19                        30,30) g729(10,20,60) g729B(10,20,60) g729AB(10,20,60) g
 20                        729A(10,20,60)
 21 18:16:27.140 CALL(RAS) (01:14985:00) RCVD H225 ARQ from GK




해결책 첫번째

특정패턴 검색해서 그 라인의 라인번호를 알아내고

바로 윗라인과 그 라인을 각각 변수 두개로 저장시킨다.
--> 문제점 : 라인번호가 하나가 있는게 아니므로 파일로 따로 라인번호들만 저장해서
    sed 가 파일로부터 라인번호를 읽어와서 작업을 하도록 해야 ??
예를 들어서
14번에서 패턴이 검출되고 (빈칸이 10개 이상 포함되는 라인들)
13번 라인을 변수 A 로 지정
14번 라인을 변수 B 로 지정


변수 C = $B$A

두 라인을 합친 것을 C 라인

원본에서 $B 를 $C로 치환 ( sed ? )
원본에서 14번 라인을 삭제
--> 문제점 하지만 특정패턴이 두번 반복되면 ?

새로운 파일로 리다이렉트
1 18:16:27.140 CALL(225) (01:14985:00) SENT L4 RTR DIP W/MEDIA PARAM ID:  771 to
2                        L4

#!/bin/bash
logfile=/test/log.txt
outfile=/test/out.txt
#현재 하나의 특정패턴에 대해서만 적용됨, 라인들을 임시파일로 지정하고 그곳으로부터 sed 를
#순차적으로 진행시키는 것??
# grep -n "          *" $logfile | awk -F: '{print $1}'  > imsy.txt
# imsy.txt 가 라인번호만 써진 파일
# 여기서 최종 치환을 수행하도록 imsy.txt 파일을 변경 ?
#

B=`grep -n "          *" $logfile | awk -F: '{print $1}' `
#echo "B =" $B
A=`expr $B - 1 `
#echo "A =" $A

C=`sed -n ''$B'p' $logfile`
#echo "C=" $C
D=`sed -n ''$D'p' $logfile`
echo "D=" $D

E=$C$D
echo "E=" $E
# 여기서 sed 로 치환하면 에러발생
sed ''$A's'$C'/'$E'/g' $logfile > $outfile


2009. 3. 31. 17:01

7. sed 란?


첫번째 라인 출력

sed -n '1p' filename

마지막 라인 출력

sed -n '$p' filename

두번째 라인 출력

sed -n '2p' filename

첫번째부터 세번째 라인까지 출력 ( 1번 라인 부터 3번 라인까지 포함 )

sed -n '1,3p' filename

첫번째라인 부터 세번째 라인까지 삭제하고 출력
sed '1,3d' filename

특수한 문자열(예를들어 root)을 검색해서 그 라인만 출력

sed -n '/root/p' filename

love가 나오는 행과 peace가 나오는 행 사이의 모든 행들이 출력된다. love가 peace 다음에 나오면 love가 나오는 행부터 마지막 행까지 출력된다.

sed -n ‘/love/,/peace/p’ datafile


파일 안의 빈줄들만 모조리 삭제하고자 할때 .

sed '/^$d' 파일명 > 새파일명

특정 단어를 찾아서 변환하고자 할때
sed 's/TEST/test/g' > 새파일명

특정 단어를 찾아서 지우고자 할때
sed 's/TEST//g' > 새파일명



sed 에 관한 도움말

# sed --help
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

  -n, --quiet, --silent
                 suppress automatic printing of pattern space
  -e script, --expression=script
                 add the script to the commands to be executed
  -f script-file, --file=script-file
                 add the contents of script-file to the commands to be executed
  -i[SUFFIX], --in-place[=SUFFIX]
                 edit files in place (makes backup if extension supplied)
  -c, --copy
                 use copy instead of rename when shuffling files in -i mode
                 (avoids change of input file ownership)
  -l N, --line-length=N
                 specify the desired line-wrap length for the `l' command
  --posix
                 disable all GNU extensions.
  -r, --regexp-extended
                 use extended regular expressions in the script.
  -s, --separate
                 consider files as separate rather than as a single continuous
                 long stream.
  -u, --unbuffered
                 load minimal amounts of data from the input files and flush
                 the output buffers more often
      --help     display this help and exit
      --version  output version information and exit

2009. 3. 5. 15:18

5. 날짜표시 (date)

#!/bin/bash
date= date +%Y-%m-%d_%H:%M:%S
echo $date

이것은 날짜를 표시해주는 스크립트이고
date 명령어를 통해 원하는 방식으로 날짜와 시간등등을 표현해줄 수 있다.

실행시키면 다음과 같은 결과를 얻는다.

[root@localhost ~]# ./date.sh
2009-03-05_15:18:07


다른 방식으로도 가능하다 today 라는 변수를 지정해서 그 안에 날짜 정보를 넣으면
#!/bin/bash
today=`date +%Y%m%d`
echo $today
[root@localhost ~]# ./date2.sh
20090305

이렇게 나오게 된다.
2009. 3. 4. 15:42

4. 기본 루프문 (while)

#!/bin/bash
A=1
while [ $A -lt 5 ]
do
        echo $A
        A=`expr $A + 1`
done

이 쉡 스크립트를 보면 While 문을 사용해서
A 를 1부터 차례로 5보다 작은 수 즉 4까지 증가시키면서
화면에 A 값을 출력하는

기본 루프문 이다.

첫줄은 bash 쉡을 이용한다는 뜻
두번째 A=1 은  변수 A 의 초기값이 1 이라는 뜻
세번재 while 문에 조건  즉 변수A ($A) 가  5보다 작을때까지  다음에 오는 do 와 done 사이의 명령을 반복
echo $A 는 화면에 A의 값을 출력
A 에 1씩 더하는 것

무한 루프문
#!/bin/bash
while [ : ]
do
echo -n "test "
done

while [ : ] 에서 : 은  실행결과가 참이므로 do 와 done 사이의 명령을 계속 수행한다.
중지하려면 Ctrl + C 를 눌러 중지한다.