전에는 awk로 표준출력을 가지고 놀았었죠...

이번엔 바로 파일로 가자구요.^^

흠..awk를 테스트 하는 프로그램을 만들어 보아요..

우선 아래 코드를 보시고 시작을 할까요?

File 1. 22 (DATA FILE)

길이|1|290
태호|0|100
성철|0|50


File 2. awktest

awk -F '|' '
    BEGIN{
                print "==============================";
                print "이름  |  바보여부 |  IQ";
            }
            {
                if ($2 == "1")
                {
                    BaboYn="Y";
                }
                else
                {
                    BaboYn="N";
                }

                print $1 "  |     " BaboYn "     |  " $3;

            }
    END  {
                print "==============================";
            }' 22


# Output
==============================
이름  |  바보여부 |  IQ
길이  |     Y     |  290
태호  |     N     |  100
성철  |     N     |  50
==============================


위처럼 저는 awk를 이용해서 22파일을 읽어서 제어하는 프로그램을 만들어 보았습니다.

awk에서 -F 가 구분자라는것은 전에 말씀 드렸죠?..^^

그리고 BEGIN은 파일을 열기전에 실행할 코드 입니다.

단순히 헤더를 만든다던가 할때 쓰면 좋겠죠..

아니면 연산을 할때 써도 좋구요..

좀 코드를 깔끔하게 하고자 하신다면..

사용하실 변수를 BEGIN에서 선언해도 좋습니다.^^


그리고 아무것도 없이 {}로 되어 있는 녀석들 있죠?

이녀석들이 파일을 한줄씩 읽어서 안의 코드를 실행 시켜주는 역할을 합니다.

파일이 1000000줄이라면 1000000번 실행 되겟죠??..^^

우선 $2 는 구분자 기준으로 두번째에 있는 녀석이고요..

이 녀석 값이 1 이면 BaboYn이라는 변수에 "Y"를 넣어줍니다..
아니면 BaboYn변수에는 "N"을 넣어 주고요..

그다음에는 print를 통해서 출력을 합니다..

이렇게 데이터 파일의 라인수 만큼 로직을 실행한뒤에 END 문을 탑니다..

END문은 프로그램이 종료하기전 한번만 타는 것이죠

저는 END에서 그냥 "==="를 출력 해 주었습니다.

모...Sum이 필요하다면 END부분에서 SUM한 값을 출력해줄 수도 있겠죠..

으흐흐...아주 쉽죠?

날로 먹는것 같다고요?;;

죄송합니다...삐질;;;

다음 이시간이 또 있을겁니다..

무언가 준비하겠죠.^^

으흐흐..부족한것 있으면 댓글이나 트랙백 주시면 감사하겠습니다.

댓글은 항상 열려 있으니..

부족하거나 요청 하실것이 있으면 말씀 주세요.^^..

awk를 한번은 써야지 생각 했는데..

생각해 보니 분량이 너무 많다..ㄱ-;;

그래서 간단히 쓰는것 부터...

하나씩 하나씩 포스팅 해 보고자 한다.^^

그냥 awk의 단순한 기능을 한번 보여주고자 한다..

이것만 알아도...단순한 awk처리는 가능할 것 같다.^^

awk로 구분자로 되어 있는 데이터를 읽어 오는 것을 한번 만들어 보았다..

우선 아래와 같은 DATA 파일이 있다고 가정 하자..!!

File 1. 11

1|2|3|4
5|6|7|8
9|10|11|12

파일 몬양이 왜 이따구냐고 따지지 말자!!

내 맘이다.ㅎㅎ

여기서 | 를 구분자로 2번째 있는 데이터 만 뽑고 싶다..

그렇다면..

쉘에서 단순히

[ellin@Coji] cat 11 | awk -F '|' '{print $2}'

라고 쳐보자..

오!! 두번째 인자만 뽑을 수 있다...신기하군..= 0 =

그럼 두번째 세번째를 뽑는데 그 사이에 "|"를 넣어 볼까?

[ellin@Coji] cat 11 | awk -F '|' '{print $2"|"$3}'

오호....신기하군...

파일로 받고 싶다고?

[ellin@Coji] cat 11 | awk -F '|' '{print $2"|"$3}' > 22

오호...쉽고 간단하군.ㅋㅋ

하지만 이것은 awk의 아주 단순한 처리이다..

더 복잡하고 어려운것도 많다..ㅋㅋ

#2 에서는 조금더 신기한 기능을 가지고 설명 하도록 하겠다...

'컴퓨터 이야기' 카테고리의 다른 글

윈도우 비스타 출시와 Active X  (8) 2007.02.14
UNIX 아주 간단한 awk #2  (0) 2007.02.14
UNIX 에서 "expect"라는 신기한 녀석!!  (0) 2007.02.10
Unix 라인에디터  (0) 2007.02.09
find를 이용한 스크립트.  (0) 2007.02.08

프로그래머가...

100본 정도의 프로그램을 만들었다고 가정해봅시다..

갑자기... 코딩규칙이 바뀌거나..

모든 코드에서 쓴 또는 일부에서 쓴 함수명이 바뀌어 모든 파일을 수정 해야 하는경우가.

꼭 몇번씩 있습니다..

ㄱ-;; 저 일주일에 한번씩은 그런 일을 겪는 것 같습니다.

하지만!! 우리 Unix 프로그래머에게는 ed, red, vim 을 쉘에서 쓸수 있는..

라인에디터를 주셨습니다..

아..어느 분이신지 감사합니다.....ㅠ0ㅜ

ed, red, vim의 차이점?

크게 차이는 없는것 같습니다.

ed와 red는 시스템에 따라서 ed가 되고 red가 되는 차이인것 같고..

vim은 ed에서 쓰는 vi명령에다가 vim의 명령을 추가 했다는 느낌의 차이 뿐입니다..

자..각설하고!!

사용법을 구경해 봅시다..

Syntax

       ed [ -p String] [ -s | -] [File]

       red [ -pString] [ -s | -] [File]

사실 저도 오늘 Syntax는 처음 보았습니다.ㄱ-;;

결론는 -p옵션이나 -s 옵션을 모른다는 거죠..ㄱ-;

그래서 찾아 보았습니다.

Flags

       -p String
            Sets the editor prompt to the String parameter. The default for String is a null value
            (no prompt).
       -s
            Suppresses character counts that the editor displays with the e subcommand, r
            subcommand, and w subcommand. This flag also suppresses diagnostic messages for the e
            subcommand and the q subcommand, and suppresses the ! (exclamation point) prompt after
            an ! subcommand.
       -
            Provides the same functions as the -s flag.

자세히는 모르겠지만...
 - : e, r, w, q, ! 명령에 의해 발생하는 메시지를 금지한다.
  -s : 검사 작업을 금지한다.
  -p문자열 : 프로프트를 원하는 문자열로 바꾼다.

대충 이런 내용이라고 합니다..;;

하지만 이 옵션들을 별로 써보지 않아서.^^;;

자 그럼 대략적인 사용방법과 내용을 보여 드리지요.^^

아래는 코딩규칙의 변경으로 인해서..MSG CODE를 8000에서 8001로

일괄 변경 작업을 위한 것 입니다.

File 1. cvi

vi $1 << EOF
:1,$ s/MSG_8000/MSG_8001/g
:w
:q
EOF

File 2. cvi2

red $1 << EOF
1,$ s/MSG_8000/MSG_8001/g
w
q
EOF

대충 이해가 가시나요?

전 vi대신에 vim을 써도 되고

red 대신에 ed를 써도 됩니다.^^

자..이렇게 만들어 놓았으면...

적용을 해보아야지요?

File 3. ex

cvi PROGRAM1.pc
cvi PROGRAM2.pc
cvi PROGRAM3.pc
cvi PROGRAM4.pc
cvi PROGRAM5.pc
cvi PROGRAM6.pc

자 이 파일을 만들어 돌려 봅시다.

오홋!!

다 바뀌어 있군요.ㅋㅋ

편하고 좋지요?

이제 되도록 이런 노가다는 라인에디터에게 시키자고요.^^

우리는 고급 인력!! 프로그래머 입니다....((어멋!! 프로그래머 아니시라고요? 그럼 말구요..ㄱ-;;)

고급인력에게 이런 노가다는..해악!! 입니다.ㅎㅎ

그럼 다음에는...무얼 가지고 나올지 모르겠지만.^^

다음에 또 뵙겠습니다.ㅎㅎ





 

'컴퓨터 이야기' 카테고리의 다른 글

UNIX 아주 간단한 awk #1  (0) 2007.02.12
UNIX 에서 "expect"라는 신기한 녀석!!  (0) 2007.02.10
find를 이용한 스크립트.  (0) 2007.02.08
내가 쓰는 ORACLE..  (2) 2007.02.08
나의 백업 솔루션  (0) 2007.02.06

이번에는 아주 간단한 스크립트 입니다.

유닉스에서 자주 사용하는 find 명령이 있지요?

저는 find문을 일일이 다 치가다 어느 순간부터 귀차니즘에 빠져서..

이런 간단한 쉘을 만들어서 쓰고 있습니다..

2번, 3번 검색은 시스템에 따라 다른것인지..모르겠지만..

제가 현제 쓰는 세스템에서는

grep에 `find` 쓰는 형태보다 성능이 현저하게 느리게 나타나고 있씁니다.

차후에 바꿀까 고민도 하고 있지만..

어차피 find하는것이 아주 오래 걸리는것도 아니고..

우선은 그냥 쓰고 있습니다.

그리고 grep `find`는 파일이 많을때 문제가 될 여지가 있을 것 같은 느낌도 잇고요^^

이렇게 뛰어난 검색을 제공해주는 unix 시스템이 참 좋습니다.^^;;

윈도그에서는 구글 데스크탑을 쓰기도 하지만....

그것도 먼가 불만 스럽다는..^^;;

1. findf
단순히 파일명을 검색하는 find명령 입니다.
에러 출력을 하지 않기위해 2>/dev/null 을 사용했습니다.

find . -name $1 -print 2>/dev/null

2. findc
이것은 원하는 내용이 포함된 파일의 그 포함된 내용을 찾기 위해 사용하는 명령입니다.

if [ $# -eq 2 ]
then
    find . -name "$1" -exec grep "$2" {} \;
else
    echo "인자는 두개";
fi

3. findcf
이것은 원하는 내용을 파일명을 찾기위해 사용하는 명령입니다.

if [ $# -eq 2 ]
then
    find . -name "$1" -exec grep -l "$2" {} \;
else
    echo "인자는 두개";
fi



'컴퓨터 이야기' 카테고리의 다른 글

UNIX 에서 "expect"라는 신기한 녀석!!  (0) 2007.02.10
Unix 라인에디터  (0) 2007.02.09
내가 쓰는 ORACLE..  (2) 2007.02.08
나의 백업 솔루션  (0) 2007.02.06
내가 쓰고 있는 .vimrc  (0) 2007.02.05

((아래는 말을 편히 하기위해서..^^
   좀 건방지게 한 면이 없지 않습니다..
   양해 부탁드리겠습니다..^^;;))

"백업에 실패한 개발자는 용서할 수 없다"

우리 사장님이 늘상 하시는 말씀이다.

나도 그렇다고 생각한다.

데이터, 코드를 날리고 백업을 하지 않아.

그만큼의 시간을 낭비한다는 것은 촉박을 다루는 프로그래머에게 아주 큰 실수이다.


어느 개발자나 개인적으로 백업 솔루션(?) 정도는 개발 하고 가지고 있어야 한다고 생각한다.

세상에 믿을건 나 밖에 없다..

회사에서 아무리 좋은 백업솔루션을 사용한다고 해도 파일 하나를 백업하기 위해서는

좀 많은 노력이 필요하게 된다.

수천개 수만개의 데이터를 백업하는데..

한개를 날렸다고 복구 솔루션을 돌리기는 부담스럽지 않은가..

나는 아래와 같은 백업 솔루션은 구성해 놓고 사용하고 있다.(유닉스환경)

File 1. bgback
이것은 cron을 지원하지 않는 시스템을 사용하기에..억지로 구성해 놓은것이다..ㄱ-;;

#! /usr/bin/ksh

while [ 1 ]
do
    /koscom/accnt/usr/hkkim2/hkkim/bnkback
    sleep 86400
done


억지 같다고..? -_-;; 난 어쩔수 없었다..

File 2. upback
이것은 FTP로 다른 PC로 전송하기 위해 만든 것이다. 서버 관리자가 실수로 서버 날리는 경우가 생기지 않는다고 장담 할 수 없다..내가 서버 관리를 해도 나를 못 믿을 것이다.
나는 내가 사용하고 있는 개발용 PC로 전송한다..
내 PC하드가 깨지면 어떻하냐고?
설마 내 하드와 서버그리고 회사 백업솔루션이 동시에 날아갈까.ㅡ_ㅡ;;
만약 그렇다면 울어버리는거다..ㄱ-;;

echo "========================================"
echo "  Open FTP Connection                   "
echo "========================================"
ftp -n xxx.xxx.xxx.xxx << EOF
    user username password
    put $1
    rm work.tar.gz
    put work.tar.gz
    bye
EOF
echo "========================================"
echo "  Close FTP Connection                  "
echo "========================================"

File 3. bnkbackup
실행명 이름들이 왜 이렇냐고 따지지 마라.-_-
내맘이다..
우리는 은행업무를 하는 팀이기 때문에.
bnk라고 넣은것 뿐..;;
단순히 압축만 해버리는 일을 한다.

if [ $# -eq 1 ]
then
        echo "======================================================"
        echo "      START BACKUP SHELL ($1)"
        echo "======================================================"
        cd ~/.backup/
        tar -cvf $1 /koscom/accnt/usr/DP/bank
        tar -cvf work.tar /koscom/accnt/usr/hkkim2/aps_bank
        gzip $1
        gzip work.tar
        echo "======================================================"
        echo "      END BACKUP SHELL ($1)"
        echo "======================================================"
else
        echo "argc is not 1 ($#)"
fi


File 3. bnkbackup
이건 File2, File3을 이용해서 실재 실행하는 놈이다.
File1은 단지 FTP용일 뿐이고..

filename=Bnk_`date +%Y_%m_%d_%H%M%S`.tar
cd ~/.backup
~/hkkim/bnkbackup $filename >> ~/.backup/log/backup.log
~/hkkim/upback $filename.gz >> ~/.backup/log/backup.log
rm -fr *.gz


현재는 DB백업하는 일이 없기때문에 단순하다..
그리고 나라는 놈은 쓸대 없이 프로그램을 많이 나누어 놨따.ㅋㅋ

모 만든 사람 맘이지..-_-;;

'컴퓨터 이야기' 카테고리의 다른 글

find를 이용한 스크립트.  (0) 2007.02.08
내가 쓰는 ORACLE..  (2) 2007.02.08
내가 쓰고 있는 .vimrc  (0) 2007.02.05
(표준화)데이터 용어사전의 필요성.  (0) 2006.12.05
Programing에 대해서 주저리주저리  (1) 2006.12.01

+ Recent posts