'쉘스크립트'에 해당되는 글 23건
- 2013.07.09 grep으로 특정문자열 제외 + 빈줄제거
- 2013.04.08 awk 로 특정 라인에 특정 문자 삽입하기 2
- 2012.12.03 awk 관련 추가 설명 2
- 2012.03.22 CPU 과부하와 MEM 과부하 프로세스 찾는 스크립트
- 2011.09.19 파일 사이즈가 0 인 개수 확인 스크립트
- 2011.09.07 1초 마다 특정 작업을 하는 스크립트
- 2011.09.03 파일 비교 스크립트 8
- 2011.08.05 날짜 표시 쉘 스크립트
- 2011.06.17 파일 라인안에 앞에 내용 추가 / 맨뒤에 내용 추가 방법
- 2010.05.25 파일비교 스크립트 5 2
- 2010.04.22 파일들의 확장자만 변경
- 2009.12.22 15. 텍스트 파일 포맷 변경 2
- 2009.12.18 14. 지난 파일 압축하고 삭제하기 2
- 2009.11.05 13. 파일 비교 스크립트 4 2
- 2009.10.21 12. 파일 개수 비교해서 삭제하는 스크립트 3
- 2009.09.19 11. SSH 접속 차단 스크립트 ( 5번 패스워드 틀리면 자동 차단) 2
- 2009.09.18 10. 파일비교 스크립트2 3
- 2009.09.10 9. 여러 파일 하나의 txt 파일로 합치기 스크립트 3
- 2009.09.10 8. 파일 내용 비교1 3
- 2009.06.01 스크립트 문제
grep으로 특정문자열 제외 + 빈줄제거
grep 으로 특정 문자열 제외 + 빈줄 제거
grep -v "#" | grep -v '^$'
주로 시스템 기본 conf 파일들의 경우 주석이 많은데 해당 주석을 제거하고 보고
동시에 빈줄로 나오는 라인까지 제거 하는 방법
'쉘스크립트' 카테고리의 다른 글
awk 로 특정 라인에 특정 문자 삽입하기 (2) | 2013.04.08 |
---|---|
awk 관련 추가 설명 (2) | 2012.12.03 |
CPU 과부하와 MEM 과부하 프로세스 찾는 스크립트 (0) | 2012.03.22 |
파일 사이즈가 0 인 개수 확인 스크립트 (0) | 2011.09.19 |
1초 마다 특정 작업을 하는 스크립트 (0) | 2011.09.07 |
파일 비교 스크립트 8 (0) | 2011.09.03 |
날짜 표시 쉘 스크립트 (0) | 2011.08.05 |
파일 라인안에 앞에 내용 추가 / 맨뒤에 내용 추가 방법 (0) | 2011.06.17 |
파일비교 스크립트 5 (2) | 2010.05.25 |
파일들의 확장자만 변경 (0) | 2010.04.22 |
awk 로 특정 라인에 특정 문자 삽입하기
awk 를 통해서 특정 데이터 파일안의 몇번째 라인에
특정 라인을 삽입할 수 있다.
예를 들어 data.txt 라는 파일안에 아래와 같은 내용이 있을 때.
aaa 11
bbb 22
ccc 33
bbb 22 라는 두번째 라인 다음에
test 44 라는 라인을 넣고자 할 때에는 다음과 같이 awk 를 실행시킨다.
[si@localhost script]$ cat data.txt
aaa 11
bbb 22
ccc 33
[si@localhost script]$ awk 'NR==2 {print $0"\ntest 44"}' data.txt
bbb 22
test 44
NR 이라는 옵션은 라인을 지정하는 옵션이며 NR==2 즉 2번째 라인일 경우에는
print $0 즉 2번째 라인은 모든 내용을 출력하고
그 뒤에 "" 로 묶인 내용을 출력한다.
쌍따옴표로 묶인 내용의 시작이 라인 구분 표시자인 \n 으로 시작되기 때문에
라인을 바꾸게 되고
그 뒤에 test 44 를 찍게 된다.
'쉘스크립트' 카테고리의 다른 글
grep으로 특정문자열 제외 + 빈줄제거 (0) | 2013.07.09 |
---|---|
awk 관련 추가 설명 (2) | 2012.12.03 |
CPU 과부하와 MEM 과부하 프로세스 찾는 스크립트 (0) | 2012.03.22 |
파일 사이즈가 0 인 개수 확인 스크립트 (0) | 2011.09.19 |
1초 마다 특정 작업을 하는 스크립트 (0) | 2011.09.07 |
파일 비교 스크립트 8 (0) | 2011.09.03 |
날짜 표시 쉘 스크립트 (0) | 2011.08.05 |
파일 라인안에 앞에 내용 추가 / 맨뒤에 내용 추가 방법 (0) | 2011.06.17 |
파일비교 스크립트 5 (2) | 2010.05.25 |
파일들의 확장자만 변경 (0) | 2010.04.22 |
awk 관련 추가 설명
원문 : http://blog.naver.com/PostView.nhn?blogId=jjjhyeok&logNo=20151320029
awk는 명령어를 사용하다보면, 의외로 자주쓰는데, 지금까지 얼추 맞춰서 쓰다가 문서는 찾았습니다만, 위키에 없어서 찾은것들을 정리해서 글을 씁니다. 공개되어있는 문서를 찾아서 했기에, 절대 창작문서가 아닙니다.
1 Awk란?
2 awk의 구조(Model)
3 awk 프로그램
3.1 일반적인 awk 의 용도 및 사용방법(Using Model)
- egrep 및 grep 을 이용한 데이터 파일의 구조 확인을 한다.
- 정규화가 가능한지를 확인하고, sed로 테스트 해본다. awk가 처리할만큼 정규화가 되어 있다면, 바로 awk를 사용한다.
- sed로 정규화된 양식을 awk로 처리한다.
■■■□■■■■□■■■□■■■□■■■■■■□■■■■ |
■■■■□■■□■■■■■■■□■■■■□■■□■■■■ |
■■□■■■■■■■■■□■■□■■□■■■■■■■■□■ |
위의 데이터는 아래의 형식으로 바뀌게 된다.
record1: | ■■■ | ■■■■ | ■■■ | ■■■ | ■■■■■■ | ■■■■ |
record2: | ■■■■ | ■■ | ■■■■■■■ | ■■■■ | ■■ | ■■■■ |
record3: | ■■ | ■■■■■■■■■ | ■■ | ■■ | ■■■■■■■■ | ■ |
Field 1 | Field 2 | Field 3 | Field 4 | Field 5 | Field 6 | |
$1 | $2 | $3 | $4 | $5 | $6 |
(위의 표가 잘 이해되지 않는다면, DB 입문서 등을 읽어보도록 한다.)
3.2 Example 1 - 간단한 awk 사용
# cat exam_result.dat 박종규 95점 이억운 98점 이훈강 99점 엄성기 100점 정영원 97점 박오근 98점
# awk '{print $1}' exam_result.dat 박종규 이억운 이훈강 엄성기 정영원 박오근print 명령은 간단히 처리중에 필요한 내용을 출력하는 함수이다. "$1"은 1st(첫번째) 필드를 지시한다. 마찬가지로 점수를 출력하려면, "$1" 대신에 "$2"를 입력하면 된다. 그러면, 라인의 전체 내용을 출력하려면 어떻게 해야 하는가? "$0"를 사용하면, 라인의 전체 내용을 출력할 수 있다.
# cat sedscr s/점$// # sed -f sedscr exam_result.dat 박종규 95 이억운 98 이훈강 99 엄성기 100 정영원 97 박오근 98자 이제 계산할 수가 있을 듯 하다. 그러면, 프로그램을 짜보자.
# sed -f sedscr exam_result.dat | awk 'BEGIN{ sum = 0; print "총점 출력 프로그램"; } {sum += $2} END {print "합계 : " sum}' 총점 출력 프로그램 합계 : 587위의 내용을 설명하도록 하면 다음과 같다.
#!/bin/awk # # This Program is for Summing of exam_result. # # BEGIN : 프로그램 시작 처리 BEGIN { sum = 0; print "총점 출력 프로그램"; } # ROUTINE : 프로그램 본문 { sum += $2; } # END : 프로그램 마무리 처리 END { print "합계 : " sum; }위에서 첫줄의 #!/bin/awk는 앞으로의 내용들은 /bin/awk 프로그램을 사용해서 번역(처리)을 하겠다라는 지정 구문이다. 쉘스크립트의 "#!/bin/sh"와 같은 역할을 한다고 생각하면 될 것이다. 첫줄 이외에 "#"으로 시작하는 문장들은 모두 주석이다. 프로그램의 설명이나, 함수, 루틴에 대한 설명을 적어둔다. 각 내용은 한줄이 끝날때마다 ";"(세미콜론)을 붙여서 분리를 한다.
$ sed -f sedscr exam_result.dat | awk -f sum.awkawk 스크립트 파일을 호출할 때에는 "-f 파일이름" 옵션을 사용한다는 것을 기억해야 한다.
#!/bin/awk # # This Program is for Summing of exam_result. # # BEGIN : 프로그램 시작 처리 BEGIN { sum = 0; print "총점 출력 프로그램"; } # ROUTINE : 프로그램 본문 { sum += $2; } # END : 프로그램 마무리 처리 END { print "합계 : " sum; average = sum / NR; print "평균 : " average; }실행을 하면 아래와 같이 된다.
$ sed -f sedscr exam_result.dat | awk -f sum.awk 총점 출력 프로그램 합계 : 587 평균 : 97.8333
3.3 awk의 내부변수
FS | 필드 구분자 - Fields Seperator |
RS | 레코드 구분자 - Records Seperator |
NF | 현재 레코드의 필드수(Number of Fields) |
NR | 현재 파일에서 레코드 넘버(Number of Records) |
FNR | 입력파일이 여러개인 경우에 현재 파일에서의 NF를 표시한다. |
OFS | 출력시의 FS(Output Fields Seperator). 이 값을 변경하게 되면, 출력시의 FS 가 바뀌게 된다. |
ORS | 출력시의 RS(Output Records Seperator). 이 값을 변경하게 되면, 출력시의 RS 가 바뀌게 된다. |
3.4 Example 2 - awk 프로그램 응용
# cat cards.dat 백종규 리눅스넷(주) 부산 광역시 연제구 연산동 한창 빌딩 432호 051-851-2761 김진욱 이지시스템 서울시 서초구 방배2동 450-3 3층 02-3473-6282위의 데이터 파일은 한줄이 한 레코드가 되지 않는다는 걸 알수 있다. 한 레코드는 한줄이 비워진 줄, 즉 정규식으로 표현하자면 "\n\n"으로 구분되어 있으며, 레코드내에서 필드의 구분은 개행("\n")으로 구분된다. 따라서, 위의 데이터에서 이름과 전화번호만을 출력하고 싶다면, 다음과 같이 awk 스크립트를 작성할 수 있다.
#!/bin/awk BEGIN { RS = "\n\n"; FS = "\n"; } { print $1, $NF; }위의 스크립트에서 BEGIN 부분에서 RS와 FS를 임으로 "\n\n"과 "\n"으로 변경하였다. 또한 루틴부분에서는 첫번째 필드($1)와 마지막 필드($NF)의 내용을 출력하도록 하였다. NF현재 레코드에서 필드의 숫자를 나타낸다. 여기서 인자값을 호출하는 "$"을 붙이게 되면, 마지막 필드값이 출력이 되는 것이다.
4 또다른 요약 페이지
- awk는 직접 사용자로부터 입력을 받거나 아니면 지정한 파일을 가공하여 표준 출력한다. 표준 출력을 리다이렉션할 수 있다
- 사용법
- awk [옵션] '스크립트' [-v 변수=값] [파일(들)]
- awk [옵션] -f 스크립트 파일 [-v 변수=값] [파일(들)]
- cf) 편집 스크립트 파일의 사용법
- ed : ed -s(script) sourcefile < scriptfile
- sed : sed -f(file) scriptfile sourcefile > outputfile
- awk : awk -f(file) scriptfile sourcefile > outputfile
- 옵션
- -Fc : field separator 지정
- c는 필드 사이를 구분하는 구분자이다
- 직접 지정하지 않으면 공백을 기준으로 한다
- 시스템 변수 FS를 지정하는 것과 같은 효과를 지닌다
- -v 변수 = 값
- 스크립트를 실행하기 전에 미리 변수를 지정하여 준다
- $를 쓰지 않고 변수 이름만 쓰면 된다. C에서 #define처럼 생각하면 될 것이다.
- -f 스크립트 파일
- 스크립트를 파일에서 가져온다
- -f 옵션을 여러번 사용하여 여러개의 스크립트 파일을 동시에 불러와 지정한 파일에 적용할 수 있다
- -Fc : field separator 지정
- 스크립트
- 패턴 { 동작 }
- 커맨드 라인에서는 패턴, 동작 전체를 단일 따옴표로 묶는다
- 패턴만 있는 경우 : 패턴과 일치하는 레코드(라인)를 화면에 출력한다
- 동작만 있는 경우 : 모든 레코드(라인)가 동작의 대상이 된다
- 패턴
- /정규표현식/ sed가 지원하지 않는 +, ?, |, ( ) 등의 메타문자도 지원한다 또한 ^, $를 각 필드의 처음과 끝을 의미하도록 사용할 수도 있다
- 비교연산 숫자 기준, 알파벳 기준 모두 사용 가능하다
- 패턴 매칭 연산 ~ : 일치하는 부분을 나타낸다 !~ : 일치하지 않는 부분을 나타낸다
- BEGIN 첫 번째 레코드가 읽혀지기 전에 어떤 동작을 정의하여 사용하고 싶을 때 사용한다
- END 마지막 레코드가 모두 읽혀진 후 어떤 동작을 정의하여 실행하고 싶을 때 사용한다
- 패턴 { 동작 }
- 동작
- 동작은 모두 { }로 둘러싸야 한다
- 예제
- good이라는 문자열을 포함하는 모든 레코드를 출력할 때 /good/
- 각 레코드의 첫 번째 필드를 출력할 때 { print $1 }
- good이라는 문자열을 포함하는 레코드의 첫 번째 필드를 출력할 때 /good/ { print $1 }
- 두 개 이상의 필드를 가지는 레코드를 전부 출력할 때(비교연산) NF > 2
- 한 라인(\n)을 필드로, 빈 라인("")을 레코드로 구분할 때 BEGIN { FS = "\n" ; RS = ""}
- 첫 번째 필드가 good와 일치하는 레코드에 대해 세 번째 필드를 먼저 출력하고 두 번째 필드를 나중에 출력하고 싶을 때 $1 ~ /good/ { print $3 , $2 }
- good이라는 문자열이 몇 개나 들어가 있는지 계산하여 마지막 부분에서 출력하고 싶을 때 /good/ { ++x } END { print x }
- 두 번째 필드를 모두 합하고 마지막 부분에서 두 번째 필드의 총합계를 출력하고 싶을 때 { total += $2 } END { print "Total of $2: " , total }
- 레코드의 길이가 20자 이하인 것을 출력하고 싶을 때 length($0) < 20
- 네 개의 필드를 가지며 good이라는 단어로 시작하는 모든 레코드를 출력하고 싶을 때 NF == 4 && /^good/
- 빈줄을 제외한 모든 줄을 화면에 출력한다 NF > 0
- awk 시스템 변수
FILENAME 현재 파일명 $0 입력 레코드 FS 입력 필드 구분 디폴트 : 공백 $n 입력 레코드의 N번째 필드 NF 현재 레코드 필드 갯수 ARGC 커맨드 라인의 인자 갯수 NR 현재 레코드 번호 ARGV 커맨드 라인 인자를 포함하는 배열 OFMT 숫자에 대한 출력 포맷 디폴트 : %.6g ENVIRON 환경변수들을 모아둔 관계형 배열 OFS 출력 필드 구분 디폴트 : 빈줄 FNR NR과 동일 단지 현재 파일에 적용된다는 점이 다름 ORS 출력 레코드 구분 디폴트 : newline RSTART 지정한 매칭 연산을 만족하는 문자열의 맨 앞부분 RS 입력 레코드 구분 디폴트 : newline RLENGTH 지정한 매칭 연산을 만족하는 문자열의 길이 - awk 연산자
- 산술 : =, +=, -=, *=, /=, %= 조건 : ? : 논리 : ||, &&, ! 패턴 : ~, !~
- 비교 : <, <=, >, >=, !=,== 증감 : ++, -- 필드참조 : $
- 제어문(C의 제어문과 같다)
- break
- continue
- do {실행} while (조건)
- exit
- for (관계형 배열의 요소) {실행}
- 펄의 foreach와 같다
- if (조건) {실행} else {실행}
- return
- while
- awk 명령어
- 문자열 연산
- gsub(reg,s) 입력 문자열의 전반에 걸쳐 정규표현식 r을 문자열 s로 대치한다.
- gsub(reg,s1,s2) 문자열 s2에서 정규표현식 r을 s1으로 대치한다.
- index(s1,s2) s1에서 s2의 위치를 넘겨준다. 만약 없다면 0을 넘겨준다.
- length(arg) 인자의 길이를 넘겨준다.
- match(s,r) 문자열 s에서 정규표현식 r과 매칭되는 부분의 위치를 넘겨준다.
- split(string,array[,seperator]) 구분자를 기준으로(지정하지 않으면 공백 기준)해서 지정한 문자열을 배열로 만든다 배열[1], 배열[2], .......
- sub(r,s), sub(r,s1,s2) gsub과 동일하다. 단지 정규표현식과 일치하는 문자열이 여러 개라도 처음 문자열만 대치된다
- substr(s,m) 문자열 s에서 m번째 위치에서 끝까지의 문자를 리턴한다
- substr(s,m,n) 문자열 s에서 m번째 위치에서 n번째까지의 문자를 리턴한다
- tolower(str)
- toupper(str)
- 수치 연산
- atan2(x,y) y/x의 arctangent값을 라디안 단위로 넘겨준다
- cos(x)
- exp(arg)
- int(arg)
- log(arg)
- rand() 0과 1사이의 난수를 발생한다
- sin(x)
- sqrt(arg)
- srand(expr) 인자를 가지고 난수를 발생시킨다. 인자가 주어지지 않으면 시간을 가지고 난수를 발생시킨다.
- 입출력/프로세스
- close(filename) 지정한 파일을 닫는다
- close(cmd) 지정한 명령어 파이프를 닫는다
- delete array[element] 지정한 배열 요소를 지운다
- getline() 다음 레코드를 읽어 들인다
- getline[variable] [< "filename"] 파일에서 읽어들인다
- next 다음 레코드(라인)을 입력받는다 getline()과 유사하지만 /패턴/동작을 새롭게 시작한다 getline()은 다음 라인을 읽기만 한다
- print [args] ![> "filename"] 인자를 출력한다
- printf "format" [,expressions] ![> "filename"] 형식에 맞춰 출력한다
- sprintf (format [,expressions]) printf와 마찬가지로 사용하는데 값을 리턴하기만 하고 출력은 하지 않는다.
- system(command) 시스템 내부 명령어를 실행한다
- 문자열 연산
- 간단한 예
- awk ' BEGIN { for (i = 1;i<=7,i++) print int(101*rand()) }' 화면에 1이상 100이하의 난수 일곱 개를 출력한다
- ls -l file1 file2 file3 | awk ' { x += $5 } ; END { print "Total bytes : " x } ' 파일들의 크기를 모두 합하여 총 바이트 수를 표시한다
- awk ' END { print NR } ' filename 지정한 파일의 라인이 몇 개인지를 표시한다
- awk ' NR % 2 == 0 ' 지정한 파일의 짝수번째의 라인만을 출력해 준다
split(string, tmp) for (var in tmp) { new[tmp[var]] = var delete tmp[var] }
[출처] 리눅스 명령어 Awk란?|작성자 jjjhyeok
'쉘스크립트' 카테고리의 다른 글
grep으로 특정문자열 제외 + 빈줄제거 (0) | 2013.07.09 |
---|---|
awk 로 특정 라인에 특정 문자 삽입하기 (2) | 2013.04.08 |
CPU 과부하와 MEM 과부하 프로세스 찾는 스크립트 (0) | 2012.03.22 |
파일 사이즈가 0 인 개수 확인 스크립트 (0) | 2011.09.19 |
1초 마다 특정 작업을 하는 스크립트 (0) | 2011.09.07 |
파일 비교 스크립트 8 (0) | 2011.09.03 |
날짜 표시 쉘 스크립트 (0) | 2011.08.05 |
파일 라인안에 앞에 내용 추가 / 맨뒤에 내용 추가 방법 (0) | 2011.06.17 |
파일비교 스크립트 5 (2) | 2010.05.25 |
파일들의 확장자만 변경 (0) | 2010.04.22 |
CPU 과부하와 MEM 과부하 프로세스 찾는 스크립트
내용을 보시려면 비밀번호를 입력하세요.
파일 사이즈가 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
'쉘스크립트' 카테고리의 다른 글
grep으로 특정문자열 제외 + 빈줄제거 (0) | 2013.07.09 |
---|---|
awk 로 특정 라인에 특정 문자 삽입하기 (2) | 2013.04.08 |
awk 관련 추가 설명 (2) | 2012.12.03 |
CPU 과부하와 MEM 과부하 프로세스 찾는 스크립트 (0) | 2012.03.22 |
1초 마다 특정 작업을 하는 스크립트 (0) | 2011.09.07 |
파일 비교 스크립트 8 (0) | 2011.09.03 |
날짜 표시 쉘 스크립트 (0) | 2011.08.05 |
파일 라인안에 앞에 내용 추가 / 맨뒤에 내용 추가 방법 (0) | 2011.06.17 |
파일비교 스크립트 5 (2) | 2010.05.25 |
파일들의 확장자만 변경 (0) | 2010.04.22 |
1초 마다 특정 작업을 하는 스크립트
1초마다 특정 작업 ( 아래 command 부분만 편집 ) 을 하는 스크립트
현재는 ifconfig 명령어 하나를 수행하게 되어 있음.
남기는 로그 파일은 DATE 를 따라가기 때문에 분단위로 로그를 쌓을 것인지 아니면
시간단위로 할 것인지는 DATE 의 변수를 어디까지 지정하냐에 따라 달림.
ENDTIME 을 지정하여 그 시간 ( 혹은 분단위까지 ) 까지만 수행되고 스크립트 종료됨.
COUNT 를 넣었고 필요하면 COUNT 를 echo 해서 로그파일에 넣을 수도 잇음
#!/bin/bash
### Script Ending time configuration
DATE=`date +%Y%m%d%H`
# Date is 2011090713 this is HOUR setting
#DATE=`date +%Y%m%d%H%M`
# Date is 201109071314 if you want minute setting used this line alse modify the ENDTIME line
ENDTIME=2011090714
### base config
COUNT=0
DIR=$PWD
### loop stage
while true
do
if [ $ENDTIME -eq $DATE ]
then
exit 1 # exit script
else
## Command input stage
ifconfig | tee -a $DIR/Result_$DATE.txt
#echo $DATE > $DIR/Result_$DATE.txt
## Command ending
COUNT=`expr $COUNT + 1`
echo $COUNT >> $DIR/Result_$DATE.txt
sleep 1
fi
done
'쉘스크립트' 카테고리의 다른 글
grep으로 특정문자열 제외 + 빈줄제거 (0) | 2013.07.09 |
---|---|
awk 로 특정 라인에 특정 문자 삽입하기 (2) | 2013.04.08 |
awk 관련 추가 설명 (2) | 2012.12.03 |
CPU 과부하와 MEM 과부하 프로세스 찾는 스크립트 (0) | 2012.03.22 |
파일 사이즈가 0 인 개수 확인 스크립트 (0) | 2011.09.19 |
파일 비교 스크립트 8 (0) | 2011.09.03 |
날짜 표시 쉘 스크립트 (0) | 2011.08.05 |
파일 라인안에 앞에 내용 추가 / 맨뒤에 내용 추가 방법 (0) | 2011.06.17 |
파일비교 스크립트 5 (2) | 2010.05.25 |
파일들의 확장자만 변경 (0) | 2010.04.22 |
파일 비교 스크립트 8
최종 버전 파일 비교 스크립트
어느 txt 파일이든 사이즈의 크기는 상관없음.
a.txt 와 b.txt 에 담긴 내용을 sort 하여 비교
#!/bin/bash
### sort stage
sort -u a.txt > imsy
cat imsy > a.txt
sort -u b.txt > imsy
cat imsy > b.txt
### compare stage
comm -12 a.txt b.txt > duble.txt
comm -23 a.txt b.txt > a_only.txt
comm -13 a.txt b.txt > b_only.txt
### Result stage
echo "################################"
echo " a_only.txt is existed in a.txt"
echo "################################"
echo "################################"
echo " b_only.txt is existed in b.txt"
echo "################################"
echo "#########################################"
echo " double.txt is existed in a.txt & b.txt"
echo "#########################################"
'쉘스크립트' 카테고리의 다른 글
awk 로 특정 라인에 특정 문자 삽입하기 (2) | 2013.04.08 |
---|---|
awk 관련 추가 설명 (2) | 2012.12.03 |
CPU 과부하와 MEM 과부하 프로세스 찾는 스크립트 (0) | 2012.03.22 |
파일 사이즈가 0 인 개수 확인 스크립트 (0) | 2011.09.19 |
1초 마다 특정 작업을 하는 스크립트 (0) | 2011.09.07 |
날짜 표시 쉘 스크립트 (0) | 2011.08.05 |
파일 라인안에 앞에 내용 추가 / 맨뒤에 내용 추가 방법 (0) | 2011.06.17 |
파일비교 스크립트 5 (2) | 2010.05.25 |
파일들의 확장자만 변경 (0) | 2010.04.22 |
15. 텍스트 파일 포맷 변경 (2) | 2009.12.22 |
날짜 표시 쉘 스크립트
#!/bin/bash
echo $DATE
echo $DATE2
출력결과는 다음과 같다.
2. 어제 날짜를 출력하는 스크립트
#!/bin/bash
### DATE cal ###
YEAR=`date +%Y`
MON=`date +%m`
DAY=`date --date '1 days ago' +%d`
DATE=${YEAR}${MON}$DAY
echo $DATE
출력결과
[si@localhost temp]$ sh date.sh
20110803여기서는 하루 전의 날짜를 구하는게 어려웠는데 찾아보니 위와 같이 쉽게 표현이 되더군요
더하고 빼고 등등의 귀찮을 작업을 할려고 했지만
위에 처럼 좋은 게 있었네요.
3. 년도/월/일/시간/분 을 따로 구하여 한꺼번에 표시
#!/bin/bash
YEAR=`date +%Y`
MON=`date +%m`
DAY=`date +%d`
HOUR=`date +%H`
MIN=`date +%M`
echo "Now is"\ ${YEAR}${MON}${DAY}${HOUR}${MIN}
출력결과
Now is 201108042346
날짜를 표시하는 것은 여러가지 방법이 있으나 기본적으로 date 명령어를 활용하여 표현하게 됩니다.
DATE 자체로만 쓰이지 않고 주로 로그표시나 파일 생성 등 광범위하게 쓰일 수 있지요.^^
스크립트는 이런 조각조각이 모여서 만든다고 생각하심 좀 더 쉽게 접근할 수 있을 거 같습니다.
'쉘스크립트' 카테고리의 다른 글
awk 관련 추가 설명 (2) | 2012.12.03 |
---|---|
CPU 과부하와 MEM 과부하 프로세스 찾는 스크립트 (0) | 2012.03.22 |
파일 사이즈가 0 인 개수 확인 스크립트 (0) | 2011.09.19 |
1초 마다 특정 작업을 하는 스크립트 (0) | 2011.09.07 |
파일 비교 스크립트 8 (0) | 2011.09.03 |
파일 라인안에 앞에 내용 추가 / 맨뒤에 내용 추가 방법 (0) | 2011.06.17 |
파일비교 스크립트 5 (2) | 2010.05.25 |
파일들의 확장자만 변경 (0) | 2010.04.22 |
15. 텍스트 파일 포맷 변경 (2) | 2009.12.22 |
14. 지난 파일 압축하고 삭제하기 (2) | 2009.12.18 |
파일 라인안에 앞에 내용 추가 / 맨뒤에 내용 추가 방법
vi 편집기로 들어가서 해당 파일을 수정하여야 한다.
vi test.txt
편집기 들어가 있는 상태에서 라인의 맨 앞에 삽입할 내용( aaa ) 를 다음과 같이 명령어로 입려
:%s/^/aaa/g
2. 라인의 맨 뒤에 특정 단어를 추가하고자 할 경우
vi test.txt
:%s/$/aaa/g
이렇게 입력하면 aaa 라는 단어가 각 라인의 맨 앞 또는 뒤에 추가되는 것을 확인할 수 있다.
'쉘스크립트' 카테고리의 다른 글
CPU 과부하와 MEM 과부하 프로세스 찾는 스크립트 (0) | 2012.03.22 |
---|---|
파일 사이즈가 0 인 개수 확인 스크립트 (0) | 2011.09.19 |
1초 마다 특정 작업을 하는 스크립트 (0) | 2011.09.07 |
파일 비교 스크립트 8 (0) | 2011.09.03 |
날짜 표시 쉘 스크립트 (0) | 2011.08.05 |
파일비교 스크립트 5 (2) | 2010.05.25 |
파일들의 확장자만 변경 (0) | 2010.04.22 |
15. 텍스트 파일 포맷 변경 (2) | 2009.12.22 |
14. 지난 파일 압축하고 삭제하기 (2) | 2009.12.18 |
13. 파일 비교 스크립트 4 (2) | 2009.11.05 |
파일비교 스크립트 5
b.txt 에는 부분 파일
a.txt 에 있는 내용중에 b.txt 파일에 있는 내용이 포함되어 있는 라인만 뽑아내는 스크립트
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 라는 파일에 저장된다.
'쉘스크립트' 카테고리의 다른 글
파일 사이즈가 0 인 개수 확인 스크립트 (0) | 2011.09.19 |
---|---|
1초 마다 특정 작업을 하는 스크립트 (0) | 2011.09.07 |
파일 비교 스크립트 8 (0) | 2011.09.03 |
날짜 표시 쉘 스크립트 (0) | 2011.08.05 |
파일 라인안에 앞에 내용 추가 / 맨뒤에 내용 추가 방법 (0) | 2011.06.17 |
파일들의 확장자만 변경 (0) | 2010.04.22 |
15. 텍스트 파일 포맷 변경 (2) | 2009.12.22 |
14. 지난 파일 압축하고 삭제하기 (2) | 2009.12.18 |
13. 파일 비교 스크립트 4 (2) | 2009.11.05 |
12. 파일 개수 비교해서 삭제하는 스크립트 (3) | 2009.10.21 |
파일들의 확장자만 변경
이것들을 모두 JPEG 라는 확장자로 변경하고 싶다면
간단한 쉘스크립트로 변경이 가능하다.
우선 test.sh 라는 스크립트를 아래의 내용으로 만든다.
for f in *.${1}; do mv "$f" "${f%${1}}${2}"; done
실행할 때에는 test.sh txt jpeg 라고 수행을 해야 한다.
우선 chmod +x 명령어로 test.sh 에 실행권한을 주고
아래와 같이 수행한다.
./test.sh txt jpeg
아래는 수행되는 모든 과정을 보여준다.
합계 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
'쉘스크립트' 카테고리의 다른 글
1초 마다 특정 작업을 하는 스크립트 (0) | 2011.09.07 |
---|---|
파일 비교 스크립트 8 (0) | 2011.09.03 |
날짜 표시 쉘 스크립트 (0) | 2011.08.05 |
파일 라인안에 앞에 내용 추가 / 맨뒤에 내용 추가 방법 (0) | 2011.06.17 |
파일비교 스크립트 5 (2) | 2010.05.25 |
15. 텍스트 파일 포맷 변경 (2) | 2009.12.22 |
14. 지난 파일 압축하고 삭제하기 (2) | 2009.12.18 |
13. 파일 비교 스크립트 4 (2) | 2009.11.05 |
12. 파일 개수 비교해서 삭제하는 스크립트 (3) | 2009.10.21 |
11. SSH 접속 차단 스크립트 ( 5번 패스워드 틀리면 자동 차단) (2) | 2009.09.19 |
15. 텍스트 파일 포맷 변경
파일포맷을 확인하는 방법
test: ASCII text
file 명령어는 ASCII 파일인지 UTF-8 인지 UNICODE 인지 확인하는 명령어
텍스트의 포맷이 일정하지 않아서 스크립트로 처리시에 오류가 생길 경우는
recode 명령어를 통해서 포맷을 일정하게 해주는 것이 좋다.
yum -y install recode 를 통해서 리눅스 CentOS 에 설치하고
recode -l 으로 포맷형식들을 확인
recode -f UTF-8 <파일명> 이라고 명령을 내리면 해당 파일이 UTF-8 로 포맷형식이 바뀌게 된다.
dos2unix 명령어는 VI 편집기로 열었을 때 라인끝에 ^M 이라는 문자가 보이는 경우가 있다
이것을 지워주는 역할을 한다.
그리고 Col 필터는 "\n\r" 문자를 "\n" 문자로 바꾸어 주는 필터이다. 또한 공백문자
를 탭문자로 바꾸고, 백스페이스 문자를 없애는 기능을한다
( 참고 : http://darkrang.tistory.com/117 )
따라서 vi 편집기로 열었을 때에 전체적으로 이상한 기호가 보이거나 한다면
위의 recode 명령어를 사용해서 텍스트 파일의 포맷을 변경해야 한다.
또한 recode 는 * 를 지원하므로
recode -f utf-8 *.txt 라고 적어도 모든 txt 파일에 대해서 적용된다.
recode -v EUC-KR...UTF-8 *.txt
다음은 현재 디렉토리 안의 파일들의 txt 파일만 찾아서 파일포맷을 변경하는 스크립트이다
#!/bin/bash
DIR=$PWD
count=0
ls -l *.txt | awk '{print $9}' > filelist
for file in `cat $DIR/filelist`
do
recode -f UTF-8 $file
cat $file | col -b > imsy.txt
sort -u imsy.txt > $file
count=`expr $count + 1`
done
'쉘스크립트' 카테고리의 다른 글
파일 비교 스크립트 8 (0) | 2011.09.03 |
---|---|
날짜 표시 쉘 스크립트 (0) | 2011.08.05 |
파일 라인안에 앞에 내용 추가 / 맨뒤에 내용 추가 방법 (0) | 2011.06.17 |
파일비교 스크립트 5 (2) | 2010.05.25 |
파일들의 확장자만 변경 (0) | 2010.04.22 |
14. 지난 파일 압축하고 삭제하기 (2) | 2009.12.18 |
13. 파일 비교 스크립트 4 (2) | 2009.11.05 |
12. 파일 개수 비교해서 삭제하는 스크립트 (3) | 2009.10.21 |
11. SSH 접속 차단 스크립트 ( 5번 패스워드 틀리면 자동 차단) (2) | 2009.09.19 |
10. 파일비교 스크립트2 (3) | 2009.09.18 |
14. 지난 파일 압축하고 삭제하기
ㅋㅋ
#!/bin/bash ## Day and DIR configuration DATE=`date +%y%m%d` echo "date is $DATE" DIR=`echo $PWD` echo $DIR ## Decide period "A" is the range of the keeping days A=3 ## Tar and gzip compress find $DIR -mtime +$A > $DIR/imsy.txt tar -cvf $DATE.tar `find $PWD -mtime +$A` gzip $DATE.tar ## remove old files cat $PWD/imsy.txt | sed -n '/txt/p' > $PWD/imsy2.txt cat $PWD/imsy2.txt > $PWD/imsy.txt for B in `cat $PWD/imsy.txt` do echo $B # rm -rf $PWD/$B done
우선 이 스크립트의 기능은 특정 디렉토리안에 쌓이는 파일들이 계속 있을 경우
특정날짜만큼만 디렉토리에 그대로 두고
예를 들어 3 일이 지난 파일들은 모두 tar.gz 로 압축을 하고 나서
압축된 파일들은 지워버림.ㅋㅋ
find ${DIR} -type f -mtime +7 | xargs rm -f 이건??
'쉘스크립트' 카테고리의 다른 글
날짜 표시 쉘 스크립트 (0) | 2011.08.05 |
---|---|
파일 라인안에 앞에 내용 추가 / 맨뒤에 내용 추가 방법 (0) | 2011.06.17 |
파일비교 스크립트 5 (2) | 2010.05.25 |
파일들의 확장자만 변경 (0) | 2010.04.22 |
15. 텍스트 파일 포맷 변경 (2) | 2009.12.22 |
13. 파일 비교 스크립트 4 (2) | 2009.11.05 |
12. 파일 개수 비교해서 삭제하는 스크립트 (3) | 2009.10.21 |
11. SSH 접속 차단 스크립트 ( 5번 패스워드 틀리면 자동 차단) (2) | 2009.09.19 |
10. 파일비교 스크립트2 (3) | 2009.09.18 |
9. 여러 파일 하나의 txt 파일로 합치기 스크립트 (3) | 2009.09.10 |
13. 파일 비교 스크립트 4
우선 원본 파일 변경되므로 원본파일은 다른 이름으로 변경시켜 놓는다.
#!/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
'쉘스크립트' 카테고리의 다른 글
파일 라인안에 앞에 내용 추가 / 맨뒤에 내용 추가 방법 (0) | 2011.06.17 |
---|---|
파일비교 스크립트 5 (2) | 2010.05.25 |
파일들의 확장자만 변경 (0) | 2010.04.22 |
15. 텍스트 파일 포맷 변경 (2) | 2009.12.22 |
14. 지난 파일 압축하고 삭제하기 (2) | 2009.12.18 |
12. 파일 개수 비교해서 삭제하는 스크립트 (3) | 2009.10.21 |
11. SSH 접속 차단 스크립트 ( 5번 패스워드 틀리면 자동 차단) (2) | 2009.09.19 |
10. 파일비교 스크립트2 (3) | 2009.09.18 |
9. 여러 파일 하나의 txt 파일로 합치기 스크립트 (3) | 2009.09.10 |
8. 파일 내용 비교1 (3) | 2009.09.10 |
12. 파일 개수 비교해서 삭제하는 스크립트
이상이 되면 예전 파일 부터 삭제하는 스크립트
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 파일들을 삭제함
'쉘스크립트' 카테고리의 다른 글
파일비교 스크립트 5 (2) | 2010.05.25 |
---|---|
파일들의 확장자만 변경 (0) | 2010.04.22 |
15. 텍스트 파일 포맷 변경 (2) | 2009.12.22 |
14. 지난 파일 압축하고 삭제하기 (2) | 2009.12.18 |
13. 파일 비교 스크립트 4 (2) | 2009.11.05 |
11. SSH 접속 차단 스크립트 ( 5번 패스워드 틀리면 자동 차단) (2) | 2009.09.19 |
10. 파일비교 스크립트2 (3) | 2009.09.18 |
9. 여러 파일 하나의 txt 파일로 합치기 스크립트 (3) | 2009.09.10 |
8. 파일 내용 비교1 (3) | 2009.09.10 |
스크립트 문제 (0) | 2009.06.01 |
11. SSH 접속 차단 스크립트 ( 5번 패스워드 틀리면 자동 차단)
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 파일로 생성될 때에는
초기화가 된다.
'쉘스크립트' 카테고리의 다른 글
파일들의 확장자만 변경 (0) | 2010.04.22 |
---|---|
15. 텍스트 파일 포맷 변경 (2) | 2009.12.22 |
14. 지난 파일 압축하고 삭제하기 (2) | 2009.12.18 |
13. 파일 비교 스크립트 4 (2) | 2009.11.05 |
12. 파일 개수 비교해서 삭제하는 스크립트 (3) | 2009.10.21 |
10. 파일비교 스크립트2 (3) | 2009.09.18 |
9. 여러 파일 하나의 txt 파일로 합치기 스크립트 (3) | 2009.09.10 |
8. 파일 내용 비교1 (3) | 2009.09.10 |
스크립트 문제 (0) | 2009.06.01 |
7. sed 란? (2) | 2009.03.31 |
10. 파일비교 스크립트2
A 라는 파일은 원본 파일로 데이터량이 많다
B 라는 파일은 A보단 양이 적다.
원하는 것은 A 에서 B 를 제외한 나머지의 데이터를 알고 싶다.
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 에는 존재하지 않는 것이다.
1 1
2 2
3 3
4 4
5 <
6 <
7 <
8 <
최종 파일 비교 스크립트 -> http://darkrang.tistory.com/219
'쉘스크립트' 카테고리의 다른 글
15. 텍스트 파일 포맷 변경 (2) | 2009.12.22 |
---|---|
14. 지난 파일 압축하고 삭제하기 (2) | 2009.12.18 |
13. 파일 비교 스크립트 4 (2) | 2009.11.05 |
12. 파일 개수 비교해서 삭제하는 스크립트 (3) | 2009.10.21 |
11. SSH 접속 차단 스크립트 ( 5번 패스워드 틀리면 자동 차단) (2) | 2009.09.19 |
9. 여러 파일 하나의 txt 파일로 합치기 스크립트 (3) | 2009.09.10 |
8. 파일 내용 비교1 (3) | 2009.09.10 |
스크립트 문제 (0) | 2009.06.01 |
7. sed 란? (2) | 2009.03.31 |
5. 날짜표시 (date) (0) | 2009.03.05 |
9. 여러 파일 하나의 txt 파일로 합치기 스크립트
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 명령어
'쉘스크립트' 카테고리의 다른 글
14. 지난 파일 압축하고 삭제하기 (2) | 2009.12.18 |
---|---|
13. 파일 비교 스크립트 4 (2) | 2009.11.05 |
12. 파일 개수 비교해서 삭제하는 스크립트 (3) | 2009.10.21 |
11. SSH 접속 차단 스크립트 ( 5번 패스워드 틀리면 자동 차단) (2) | 2009.09.19 |
10. 파일비교 스크립트2 (3) | 2009.09.18 |
8. 파일 내용 비교1 (3) | 2009.09.10 |
스크립트 문제 (0) | 2009.06.01 |
7. sed 란? (2) | 2009.03.31 |
5. 날짜표시 (date) (0) | 2009.03.05 |
4. 기본 루프문 (while) (0) | 2009.03.04 |
8. 파일 내용 비교1
mdn 이란 변수에 전화번호 9천개가 들어있는 파일로 cat 으로 일일이 하나씩 불러오게 함
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 를 사용할 수도 있지만 구분필드가 명확하지 않아서 ㅡㅡㅋ
21번째 문자부터 31번째 문자까지만 뽑아서 d.txt 에 저장
'쉘스크립트' 카테고리의 다른 글
14. 지난 파일 압축하고 삭제하기 (2) | 2009.12.18 |
---|---|
13. 파일 비교 스크립트 4 (2) | 2009.11.05 |
12. 파일 개수 비교해서 삭제하는 스크립트 (3) | 2009.10.21 |
11. SSH 접속 차단 스크립트 ( 5번 패스워드 틀리면 자동 차단) (2) | 2009.09.19 |
10. 파일비교 스크립트2 (3) | 2009.09.18 |
9. 여러 파일 하나의 txt 파일로 합치기 스크립트 (3) | 2009.09.10 |
스크립트 문제 (0) | 2009.06.01 |
7. sed 란? (2) | 2009.03.31 |
5. 날짜표시 (date) (0) | 2009.03.05 |
4. 기본 루프문 (while) (0) | 2009.03.04 |
생성시에 길어진 라인은 짤려서 다음 라인으로 생성이 된다.!!
다음 라인으로 저장된 라인을 다시 바로 위의 라인의 끝으로 붙여넣기 할려는 목적 !!
두개의 라인이 모두 그런 패턴을 보이는 경우가 있음 !!
특정 패턴
다음 라인으로 짤려서 내려간 것은 빈칸 (스페이스) 가 10개 이상으로 연속되어 구분하기 쉽다.
위의 문제를 해결해서 새로운 파일로 저장해야 함!
예시 로그 ( 라인번호와 함께 표시 )
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
해결책 첫번째
특정패턴 검색해서 그 라인의 라인번호를 알아내고
바로 윗라인과 그 라인을 각각 변수 두개로 저장시킨다.
--> 문제점 : 라인번호가 하나가 있는게 아니므로 파일로 따로 라인번호들만 저장해서
14번에서 패턴이 검출되고 (빈칸이 10개 이상 포함되는 라인들)
13번 라인을 변수 A 로 지정
14번 라인을 변수 B 로 지정
변수 C = $B$A
두 라인을 합친 것을 C 라인
원본에서 $B 를 $C로 치환 ( sed ? )
원본에서 14번 라인을 삭제
--> 문제점 하지만 특정패턴이 두번 반복되면 ?
새로운 파일로 리다이렉트
2 L4
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
'쉘스크립트' 카테고리의 다른 글
14. 지난 파일 압축하고 삭제하기 (2) | 2009.12.18 |
---|---|
13. 파일 비교 스크립트 4 (2) | 2009.11.05 |
12. 파일 개수 비교해서 삭제하는 스크립트 (3) | 2009.10.21 |
11. SSH 접속 차단 스크립트 ( 5번 패스워드 틀리면 자동 차단) (2) | 2009.09.19 |
10. 파일비교 스크립트2 (3) | 2009.09.18 |
9. 여러 파일 하나의 txt 파일로 합치기 스크립트 (3) | 2009.09.10 |
8. 파일 내용 비교1 (3) | 2009.09.10 |
7. sed 란? (2) | 2009.03.31 |
5. 날짜표시 (date) (0) | 2009.03.05 |
4. 기본 루프문 (while) (0) | 2009.03.04 |