jrow

   jrow

  사용법


	jrow -c config [-d delimiter] [-H][-x char][-w width]] [file]
	jrow -G string:col[:desc] [-G string:col[:desc]]... [-d delimiter] [-H][-x char][-w width] [file]
	jrow -V

	Options are as follows:

	-?                     print this help
	-c config              specify configuration file which has contents of -G options
	-G string:col[:desc]   select data column (multiple choice)
	-d delimiter           input field delimiter; def: whitespace
	-H                     print header line
	-w width               specify the width of data; default: 8
	-x char                replace the specified character with a space

	file                   data file; If file is omitted, the standard input is used.

EXAMPLE)
	# jrow -H -G Kernel:4 -G Anon:4 -G Exec:6 -G cachelist:5 -G freelist:5 memstat.log
	# jrow -H -G tcpCurrEstab:2 -G tcpInSegs:2 -G tcpOutSegs:4 -G tcpOutDataBytes:4 -G tcpInInorderBytes:4 -x = netstat-s.log
  설명

jrow 명령어는 지정한 입력 파일에서 -G 옵션에 지정한 문자열(string)을 가지고 있는 라인을 찾이서 그 라인에서 지정한 컬럼 번호(col)에 있는 값을 한 줄에 출력한다.
컬럼의 구분은 디폴트로 White-space가 사용되며, -d 옵션으로 특정 문자로 변경할 수 있다.
-G 옵션을 여러 번 지정할 수 있고, -G 옵션에 지정한 컬럼 데이타를 한줄에 출력한다.

다음은 memstat.sh 쉘 스크립트를 사용하여 시스템의 물리적 메모리 사용률 수집한다.

# cat memstat.sh
while true
do
        echo "DATE `date`"
        echo ::memstat | mdb -k
        sleep 60
done

# ksh memstat.sh > memstat.log
^C#  <-- <Ctrl-C>

수집한 데이타는 다음과 같다.

# head -20 memstat.log
DATE Sun Feb 14 23:24:49 KST 2019
Page Summary                Pages                MB  %Tot
------------     ----------------  ----------------  ----
Kernel                      51993               203   10%
Anon                        51353               200   12%
Exec and libs                7085                27    1%
Page cache                  14390                56    3%
Free (cachelist)            28932               113    6%
Free (freelist)            368373              1438   71%

Total                      522126              2039
DATE Sun Feb 14 23:24:50 KST 2019
Page Summary                Pages                MB  %Tot
------------     ----------------  ----------------  ----
Kernel                      51993               203   10%
Anon                        51353               200   12%
Exec and libs                7085                27    1%
Page cache                  14390                56    3%
Free (cachelist)            28932               113    6%
Free (freelist)            368373              1438   71%

이렇게 수집된 데이타에 대하여 다음과 같이 jrow 명령어로 필요한 부분을 발췌해서 한 줄로 출력할 수 있다.

# jrow -H -G DATE:5 -G Kernel:4 -G Anon:4 -G Exec:6 -G cachelist:5:Cache-free -G freelist:5:Free-free memstat.log
    DATE   Kernel     Anon     Exec Cache-free Free-free
23:24:00      10%      12%       1%         6%       71%
23:24:00      10%      12%       1%         6%       71%
23:25:00      10%      10%       1%         6%       71%
23:26:00      10%      13%       1%         6%       71%
23:27:00      10%      14%       1%         6%       71%
23:28:00      10%      19%       1%         6%       71%
23:29:00      10%      20%       1%         6%       71%
23:30:00      10%      17%       1%         6%       71%
23:31:00      10%      12%       1%         6%       71%
23:32:00      10%      16%       1%         6%       71%
23:33:00      10%      11%       1%         6%       71%
... skip ...

다음은 -G 옵션에 대한 설명이다.
-G 옵션은 콜론(:)으로 분리된 3개의 문자열을 지정할 수 있다.
첫번째 문자열은 입력 파일에서 찾을 문자열을 지정하고,
두번째 문자열은 추출할 컴럼을 지정하고,
세번째 문자열은 생략 가능하며, -H 옵션을 지정할 때, 출력될 헤더로 사용된다. 세번째 문자열을 지정하지 않으면, 두번째 문자열이 사용된다.

-G string:col[:desc] -G =string:col[:desc] -G col~string:col[:desc] -G col~=string:col[:desc]

예제)
	-G Kernel:4
	-G Kernel:4:K-Mem
	-G =Kernel:4:K-Mem
	-G 1~Kernel:4:K-Mem
	-G 1~=Kernel:4:K-Mem

첫번째 문자열은 다음과 같이 입력 파일에서 조사할 컬럼 번호를 지정할 수 있다.

	column~[=]string

-G Kernel:4 컬럼 번호를 지정하지 않고 Kernel 이라고 지정하면, 전체 컬럼 중에서 Kernel이라는 문자를 포함하고 있는 라인을 찾아서 4번째 컬럼에 있는 값을 출력한다.
-G =Kernel:4 컬럼 번호를 지정하지 않고, 문자열 앞에 '=' 문자를 정하면, 컬럼에 포함된 것을 찾는 것이 아니고 정확히 일치하는 것을 찾아서 4번째 컬럼에 있는 값을 출력한다.
-G 1~Kernel:4 특정 컬럼에서 지정한 문자열을 찾으려면, 컬럼 번호를 지정하고 틸드(~)루 구분한 다음에 문자열을 지정하면 된다.
-G 1~Kernel:4 는 첫번째 컬럼에 Kernel 이라는 문자열을 포함하고 있는 라인을 찾아서 4번째 컬럼에 있는 값을 출력한다.
-G 1~=Kernel:4 -G 1~=Kernel:4 는 첫번째 컬럼에 Kernel 이라는 문자열과 정확히 일치하는 라인을 찾아서 4번째 컬럼에 있는 값을 출력한다.

다음은 netstat -s 명령어를 60초 간격으로 실행한 결과를 파일로 저장하여, tcpCurrEstab, tcpInSegs, tcpOutSegs, tcpOutDataBytes, tcpInInorderBytes 의 값을 추출하여 추출된 데이타를 컬럼화하여 라인 별로 출력한다.

# cat netstat-s.sh
while true
do
	netstat -s
	sleep 60
done

# ksh netstat-s.sh > netstat-s.log
^C#  <-- <Ctrl-C>

수집한 데이타는 다음과 같다.

# head -20 netstat-s.log

RAWIP   rawipInDatagrams    =     0     rawipInErrors       =     0
        rawipInCksumErrs    =     0     rawipOutDatagrams   =     0
        rawipOutErrors      =     0

UDP     udpInDatagrams      =    67     udpInErrors         =     0
        udpOutDatagrams     =   855     udpOutErrors        =     0

TCP     tcpRtoAlgorithm     =     4     tcpRtoMin           =   400
        tcpRtoMax           = 60000     tcpMaxConn          =    -1
        tcpActiveOpens      =     9     tcpPassiveOpens     =   425
        tcpAttemptFails     =     5     tcpEstabResets      =     1
        tcpCurrEstab        =     5     tcpOutSegs          =149201
        tcpOutDataSegs      =145181     tcpOutDataBytes     =19398587
        tcpRetransSegs      =     0     tcpRetransBytes     =     0
        tcpOutAck           =  4019     tcpOutAckDelayed    =  2328
        tcpOutUrg           =     0     tcpOutWinUpdate     =     0
        tcpOutWinProbe      =     0     tcpOutControl       =   863
        tcpOutRsts          =     6     tcpOutFastRetrans   =     0
        tcpInSegs           =178963
        tcpInAckSegs        =117456     tcpInAckBytes       =19398951
        tcpInDupAck         =   423     tcpInAckUnsent      =     0
        tcpInInorderSegs    = 92447     tcpInInorderBytes   =5254506
        tcpInUnorderSegs    =     0     tcpInUnorderBytes   =     0
        tcpInDupSegs        =     0     tcpInDupBytes       =     0
        tcpInPartDupSegs    =     0     tcpInPartDupBytes   =     0
        tcpInPastWinSegs    =     0     tcpInPastWinBytes   =     0
        tcpInWinProbe       =     0     tcpInWinUpdate      =     0
        tcpInClosed         =     1     tcpRttNoUpdate      =     0

# jrow -H -G tcpCurrEstab:2 -G tcpInSegs:2 -G tcpOutSegs:4 -G tcpOutDataBytes:4 -G tcpInInorderBytes:4 -x = netstat-s.log
tcpCurrEstab tcpInSegs tcpOutSegs tcpOutDataBytes tcpInInorderBytes
           5    178963     149201        19398587           5254506
           5    179140     149460        19702975           5256622
           5    179202     149495        19704795           5258442
           5    179710     150416        20915863           5260678
           5    180310     151550        22428839           5262310
           5    180915     152684        23941727           5263942
           6    181542     153836        25460121           5268086
           6    182137     154966        26972921           5269446
           6    182740     156097        28485769           5270874
           6    183366     157261        30029029           5273434

위의 jrow 명령어에 '-x =' 옵션이 사용되었는데, -x 옵션에 지정된 문자는 SPACE 문자로 교체되어서 컬럼을 구분하는데 영향을 주기위해 사용된다.

다음은 jrow 명령어의 옵션이다.

옵션설명
-c config -c 옵션을 사용하여 -G 옵션에 지정할 내용을 한줄에 한개씩 넣어서 구성 파일을 만들어 사용할 수 있다.

# jrow -H -G tcpCurrEstab:2 -G tcpInSegs:2 -G tcpOutSegs:4 -G tcpOutDataBytes:4 -G tcpInInorderBytes:4 -x = netstat-s.log

아래와 같이 config.txt 파일을 만들어 -c config.txt 옵션을 사용하면, 위의 명령어와 같은 결과를 가진다.

# jrow -H -c config.txt  -x = netstat-s.log

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

# cat config.txt
tcpCurrEstab:2
tcpInSegs:2 
tcpOutSegs:4 
tcpOutDataBytes:4 
tcpInInorderBytes:4 

구성 파일에서 공백 라인은 무시하고, '#' 문자는 주석으로 처리된다.

-d delimiter -d 옵션을 지정하지 않으면, 컬럼의 구분자로 white-space (SPACE and TAB)을 사용한다.
연속되는 white-space 는 하나로 간주한다.
-d 옵션에 컬럼의 구분자로 사용될 하나의 문자를 지정할 수있다.
-G string:col[:desc]
-G 옵션은 콜론(:)으로 분리된 3개의 문자열을 지정할 수 있다. 
첫번째 문자열은 입력 파일에서 찾을 문자열을 지정하고, 
두번째 문자열은 추출할 컴럼을 지정하고, 세번째 문자열은 생략 가능하며, -H 옵션을 지정할 때, 출력될 헤더로 사용된다.
세번째 문자열을 지정하지 않으면, 두번째 문자열이 사용된다. 

첫번째 문자열은 다음과 같이 입력 파일에서 조사할 컬럼 번호를 ~(틸드)로 구분하여 지정할 수 있다. 

	column~[=]string

문자열 앞에 = (equal) 문자를 지정하면, 해당 컬럼에서 지정한 문자열과 정확히 일치하는 라인을 찾는다.
= (equal) 문자를 사용하지 않으면, 해당 컬럼에서 문자열이 포함되어 있는 것을 찾는다.

컬럼 번호를 지정하지 않으면, 전체 컬럼 중에 지정한 문자열이 있는 것을 찾는다.
-H -H 옵션을 지정하면, 출력하는 데이타에 헤더 정보를 보여준다.
-w width -w 옵션을 사용하여 출력되는 컬럼의 폭을 지정할 수 있다.
디폴트는 8 이다. 해더를 출력할 경우에 헤드의 글자 폭은 -w 에 지정한 폭 보다 클 경우, 헤더의 폭은 크기만큼 유지된다.
-x char 입력되는 데이타에서 -x 옵션에 지정한 문자를 공백으로 교체한 다음에 컬럼을 구분한다.
-V -V 옵션을 지정하면, 명령어의 버전 정보를 보여준다.