728x90

빈줄 삭제

:g/^$/d


명령모드에서 v 를 누른 후

1행을 제외하고 블럭을 씌웁니다.

그리고 ex모드에서

g/^Getting/d 

를 하면 1행을 제외한 나머지 중에서 Getting 으로 시작하는 모든 행이 삭제됩니다.


------ 부가설명

vi에는 명령 모드 , ex모드, 삽입(insert) 모드 이렇게 3가지 모드가 있습니다.

질문하신 내용으로 보아, 아실 듯 ^^

1행을 제외한 나머지 행을 블럭을 씌우려면

gg 명령으로 가장 첫 줄로 이동한 후에

j로 한줄을 내려와

v로 블럭을 씌울 수 있게 한 후

G로 가장 아래 줄로 이동.

요약하면 ggjvG 다섯번만 손가락을 누르면 됩니다.

이동시 직접 줄 번호를 지정하거나

블럭을 씌우지 않고 ex명령만으로도 할 수 있으나

이렇게 하는 것이 직관적이고 손가락도 덜 움직이는 것 같습니다.


:g/특정문자열/d

위와 같은 ex명령은 특정문자열이 있는 라인을 삭제합니다.

조심해야 할 점이 있다면

의도하지 않은 라인까지 삭제할 가능성이 있다는 것 입니다.

예를 들면,

:% g/ting/d

ting 이라는 단어가 있는 줄을 지우려고 했는데

getting, meeting , hunting 등등의 단어가 있는 줄도 지우는 경우가 생길 수 있습니다.

이런 것을 막으려면 특정 문자열 또는 단어의 앞 뒤로 \< 와 \> 를 감싸주면

해당 단어만을 의미할 수 있습니다.

:% g/\<ting\>/d 라고 하면 ting 앞 뒤로 알파벳이 붙지 않은 오직 ting 이라는 단어만 들어 있는 줄을 삭제합니다.

% 기호는 전체라인을 의미합니다.

^ 기호는 라인의 시작을 의미합니다.

728x90

'*nix' 카테고리의 다른 글

Unix 프로세스 Job Control  (0) 2010.06.14
sed 사용법  (0) 2010.06.01
로그파일 가공하기  (0) 2010.05.17
awk 사용법  (0) 2010.05.17
[AIX] 한글 로케일  (0) 2010.01.20
728x90

리눅스에서 실시간으로 로그를 확인해야 할때가 있는데 그럴 경우 전 아래의 명령어를 실행합니다.

명령어 : tail -f access.log
실행결과 : 118.34.220.226 - -     [07/Apr/2010:14:54:42 +0900] "POST /bbs/delete_all.php HTTP/1.0" 200 121 "http://xxxx.co.kr/xxxx/xxx/xxxx/xxxx/xxx/xxx.jsp" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; EmbeddedWB 14.52 from: http://www.xxxxxcom/ EmbeddedWB 14.52; .NET CLR 1.1.4322; InfoPath.2)"

실시간으로 매우 많은 양이 로그에 기록되면서 보여주는데 정말 정신 없습니다-_-;

그래서 awk 명령어도 같이 써줍니다.
awk에 대해선 자세히 모르지만 간단히 설명 드리자면 위의 길고 알아보기 힘든 로그를 필요한 부분만 잘라서 보여주는 기능입니다.

명령어 : tail -f access.log | awk -f" " '{ print $1" : "$6" : "$7}'
실행결과 : 118.34.220.226 : "POST : /bbs/delete_all.php HTTP/1.0"

네 이렇게 깔끔하게 나옵니다. (설명 드릴 포인트에 큰 글씨체와 볼드를 먹였습니다.)
설명을 드리자면 tail -f access.log | awk -f" " '{ print $1" : "$6" : "$7}' 중 
tail -f access.log | awk -f" " '{ print $1" : "$6" : "$7}'  처럼 따옴표 안의 공백으로 구분합니다. 즉 위 가공전의 로그에 공백을 구분한다는거죠 
tail -f access.log | awk -f" " '{ print $1" : "$6" : "$7}' 로 공백 전의 문자를 찾습니다. 정규식 표현법과 비슷합니다.
$1일 경우 위 가공전 로그의 첮번째인 ip $2,$3일 경우 '-'하이픈, $4일경우 날짜인 '[07/Apr/2010:....'
이런식입니다.

마지막으로 tail -f access.log | awk -f" " '{ print $1" : "$6" : "$7}' 이부분은
118.34.220.226 : "POST : /bbs/delete_all.php HTTP/1.0" 이부분과 같습니다.

728x90

'*nix' 카테고리의 다른 글

sed 사용법  (0) 2010.06.01
vi 특정문자열 삭제  (0) 2010.06.01
awk 사용법  (0) 2010.05.17
[AIX] 한글 로케일  (0) 2010.01.20
nohup  (0) 2009.12.01
728x90

AWK

  1. awk는 직접 사용자로부터 입력을 받거나 아니면 지정한 파일을 가공하여 표준 출력한다
    표준 출력을 리다이렉션할 수 있다 
  2. 사용법
    • 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
  3. 옵션
    • -Fc  :  field separator 지정
      • c는 필드 사이를 구분하는 구분자이다
      • 직접 지정하지 않으면 공백을 기준으로 한다
      • 시스템 변수 FS를 지정하는 것과 같은 효과를 지닌다
    • -v  변수 = 값
      • 스크립트를 실행하기 전에 미리 변수를 지정하여 준다
    • -f  스크립트 파일
      • 스크립트를 파일에서 가져온다  
      • -f 옵션을 여러번 사용하여 여러개의 스크립트 파일을 동시에 불러와 지정한 파일에 적용할 수 있다 
  4. 스크립트
    • 패턴 { 동작 }
      커맨드 라인에서는 패턴, 동작 전체를 단일 따옴표로 묶는다
      • 패턴만 있는 경우 : 패턴과 일치하는 레코드(라인)를 화면에 출력한다 
      • 동작만 있는 경우 : 모든 레코드(라인)가 동작의 대상이 된다
    • 패턴
      1. /정규표현식/
        sed가 지원하지 않는 +, ?, |, ( ) 등의 메타문자도 지원한다   또한
        ^, $를 각 필드의 처음과 끝을 의미하도록 사용할 수도 있다
      2. 비교연산
        숫자 기준, 알파벳 기준 모두 사용 가능하다 
      3. 패턴 매칭 연산
        ~  :  일치하는 부분을 나타낸다
        !~ :  일치하지 않는 부분을 나타낸다
      4. BEGIN
        첫 번째 레코드가 읽혀지기 전에 어떤 동작을 정의하여 사용하고 싶을 때 사용한다 
      5. 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
  5. awk 시스템 변수

      FILENAME

      현재 파일명

      $0

      입력 레코드

      FS

      입력 필드 구분
      디폴트 :  공백 

      $n

      입력 레코드의 N번째 필드

      NF

      현재 레코드 필드 갯수

      ARGC

      커맨드 라인의 인자 갯수

      NR

      현재 레코드 번호

      ARGV

      커맨드 라인 인자를 포함하는 배열

      OFMT

      숫자에 대한 출력 포맷
      디폴트 :  %.6g 

      ENVIRON

      환경 변수들을 모아둔 관계형 배열

      OFS

      출력 필드 구분
      디폴트 :  빈줄 

      FNR

      NR과 동일
      단지 현재 파일에 적용된다는 점이 다름 

      ORS

      출력 레코드 구분
      디폴트 :  newline 

      RSTART

      지정한 매칭 연산을 만족하는 문자열의 맨 앞부분

      RS

      입력 레코드 구분
      디폴트 :  newline 

      RLENGTH

      지정한 매칭 연산을 만족하는 문자열의 길이

  6. awk 연산자

      산술 : =, +=, -=, *=, /=, %=

      조건 : ? :

      논리 : ||, &&, !

      패턴 : ~, !~

      비교 : <, <=, >, >=, !=,==

      증감 : ++, --

      필드참조 : $

       

  7. 제어문(C의 제어문과 같다)
    • break
    • continue
    • do {실행} while (조건)
    • exit
    • for (관계형 배열의 요소) {실행}
      펄의 foreach와 같다
    • if (조건) {실행} else {실행}
    • return
    • while
  8. 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) 
        시스템 내부 명령어를 실행한다 
  9. 간단한 예
    • 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 ' 
      지정한 파일의 짝수번째의 라인만을 출력해 준다 

참고서적 :  sed & awk, Dale Daugherty, O'reilly

cafe.naver.com/itpeople

728x90

'*nix' 카테고리의 다른 글

sed 사용법  (0) 2010.06.01
vi 특정문자열 삭제  (0) 2010.06.01
로그파일 가공하기  (0) 2010.05.17
[AIX] 한글 로케일  (0) 2010.01.20
nohup  (0) 2009.12.01
728x90

# env|grep LANG

LANG=ko_KR

# locale -a

C

POSIX

ko_KR

ko_KR.IBM-eucKR

en_US

en_US.8859-15

en_US.ISO8859-1

# export LANG=ko_KR.IBM-eucKR

# env|grep LANG

LANG=ko_KR.IBM-eucKR


참고


WindowsXP : MS949 -> OK
RHEL : EUC-KR
AIX: IBM-eucKR
KSC5601

728x90

'*nix' 카테고리의 다른 글

sed 사용법  (0) 2010.06.01
vi 특정문자열 삭제  (0) 2010.06.01
로그파일 가공하기  (0) 2010.05.17
awk 사용법  (0) 2010.05.17
nohup  (0) 2009.12.01
728x90

nohup


부모프로세스가 죽어도 계속 자식프로세스가 돌아감 ( cf : & )


보통 사용자가 로그인해서 여러 백그라운드 작업을 만들게 되는데 이때 백그라운드도 작업이 진행되고 있는 도중에 사용자가 로그아웃을 하면 진행 중이던 백그라운드 작업도 중단된다. 이유는 이러한 모든 백그라운드 프로세스는 사용자의 로그인 쉘에서 만들어진 자식 프로세스들이기 때문이다. 그러나 유닉스 시스템은 로그아웃하여도 백그라운드 프로세스는 계속 진행되도록 할 수 있는 명령어를 제공하고 있다.

CPU 시간을 많이 소요하는 프로세스는 이렇게 백그라운드 작업으로 진행시킴으로써 사용자들이 거의 시스템을 사용하지 않는 시간에 자신의 작업을 진행시킬 수 있다. nohup(no hang up) 명령어는 이러한 목적을 위해 사용되며, 그 형식은 다음과 같다.


% nohup 명령어 &


위 명령은 사용자가 로그아웃하는 것과 무관하게 지정해 준 작업이 모두 종료될 때까지 진행시키라는 의미이다. nohup 명령어는 일반적으로 백그라운드 작업에 사용되는데, 그렇지 않으면 프롬프트가 화면에 나타나지 않으므로 로그아웃할 수 있는 방법이 없기 때문이다. 또한, nohup상태에서 백그라운드로 작업을 수행토록 한 후, logout하였다가 다시 로그인하여 계속 중인 백그라운드 작업을 중지시킬 수 없다. 하지만 logout하지 않은 상태라면 ‘kill 프로세스번호’를 수행하여 작업을 중지시킬 수 있다.


예를 들어, 어느 anonymous ftp 사이트에서 비교적 용량이 큰 파일을 다운로드하는 경우, 트래픽의 폭주로 인하여 다운 받는 시간이 장시간 걸린다면, 다운 받는 동안 구태여 컴퓨터를 켜 놓지 않고 백그라운로 작업을 지시하는 것이 좋다.

그러므로 작업지시 명령어에는 자신이 ftp 사이트에 접속해서 행하는 명령어를 그대로 기록해 두어야 한다.

아래의 예제를 위해 radiocom.kunsan.ac.kr/pub/win에 있는 abc.exe라는 파일을 가져온다고 가정하고, 먼저 vi 편집기로 ftp에서 행하는 명령어를 그대로 작성한다.



예제】

% vi sample


ftp -n radiocom.kunsan.ac.kr << EOF

user anonymous jijoe@ks.kunsan.ac.kr

cd /pub/win

bi

get abc.exe

bye

EOF


% chmod 700 sample

% nohup sample &

% jobs

[1]  + Running  sample

% logout

% cat nohup.out   ☜ 다시 로그인해서



위 예제에서 vi 편집기로 작성된 문서를 먼저 실행모드로 바꾸기 위해서 “chmod 700”를 실시하였다. 여기서 jobs는 현재 프로그램이 정상적으로 잘 작동되고 있는지 여부를 확인하기 위해서 입력한 명령어에 불과하다. “Running sample”이라는 메시지를 보니 정상 작동되고 있음을 알 수 있으므로 이제 logout하더라도 유닉스 시스템이 원하는 파일을 다운 받아 놓는다.


nohup 명령을 이용하여 어떤 작업을 백그라운드(&)로 실행시키면, 그 진행과정은 모두 nohup.out 파일에 기록되기 때문에 차후에 진행과정을 확인하는데 유용하게 사용된다.


출처 : http://radiocom.kunsan.ac.kr

728x90

'*nix' 카테고리의 다른 글

sed 사용법  (0) 2010.06.01
vi 특정문자열 삭제  (0) 2010.06.01
로그파일 가공하기  (0) 2010.05.17
awk 사용법  (0) 2010.05.17
[AIX] 한글 로케일  (0) 2010.01.20

+ Recent posts