single quote에서 변수를 써야 하는 상황이 생길 수 있다.

예를 들어 curl을 이용해서 HTTP POST body를 사용해야 하는 상황입니다. (elasticsearch에 alias 추가 작업)


curl -s -XPOST http://${host}:9200/_aliases -d '{ "actions" : [ { "add" : { "index" : "${NEW_INDEX}", "alias" : "${ALIAS}" } }]}'


그냥 실행하면, "${NEW_INDEX}"와 ${ALIAS}를 읽지 못해서 에러가 발생한다.


그럴 때는 single quote와 double quote를 변수 앞에, dobule quote와 single quote를 변수 뒤에 붙여 쓴다.



echo 'aaaaa    $NEW_INDEX       bbbbbb'

echo 'aaaaa    '"$NEW_INDEX"'       bbbbbb'


결과 

aaaaa    $NEW_INDEX       bbbbbb

aaaaa    sns_profile       bbbbbb



맨 처음 es 요청하는 것은 다음과 같이 사용하면 잘 동작한다.


curl -s -XPOST http://${host}:9200/_aliases -d '{ "actions" : [ { "add" : { "index" : '"\"${NEW_INDEX}\""', "alias" : '"\"${ALIAS}\""' } }]}'





Posted by '김용환'
,


netstat과 watch 명령어를 혼합해서 모니터링할 때, 잘 모니터링이 안되는 경우가 있다.

바로 아래 처럼... 


 watch -n 1  "netstat -an | grep 3306  | grep EST | awk '{print $5'} | sort | uniq -c | sort -k 1,1r"



$ 앞에 \만 넣으면 된다..


watch -n1 "netstat -an | grep 3306  | grep EST | awk '{print \$5'} | sort | uniq -c | sort -k 1,1r"



Posted by '김용환'
,


awk에서 외부 변수를 사용하려면 두 가지 방법이 있는 것 같다.



1. single quot와 double quot를 사용한 방식이다. 

예) '  "  $변수이름 "  '


$ a=1 ; echo 55 | awk '{print '"$a"' $1}'

155



2. 또는 awk의 -v 옵션을 이용하는 방법이 있다.

예) -v 새변수이름=$기존 변수 '{print 새변수이름 $1}'



$ a=1 ; echo 55 | awk -v b=$a '{print '"$a"' $1 b}'

1551


Posted by '김용환'
,


sort는 기본적으로 하나의 seperator를 기준으로 파싱한다. 

따라서 여러 seperator가 있는데, 다르게 sort하고 싶다면, 좀 꽁수를 써야한다.


"숫자:숫자:show\t개수" 형태의 로그를 분석할텐데, 첫 번째 숫자와 \t 뒤의 개수로 정렬하려고 한다.


예제


$ cat test

1:10151575:show 1

1:11791136:show 3

1:12589310:show 2

1:15509090:show 1

2:16981178:show 1

2:17484153:show 1

1:17948015:show 3

3:19560507:show 1

3:19670147:show 1

1:20954348:show 5

4:21565714:show 1

1:2222999:show 7

1:22429745:show 2

1:2343166:show 1

1:24317738:show 1

4:26015409:show 1

5:26972412:show 1

6:27028699:show 1

1:27647386:show 3

1:28222001:show 2

1:29852663:show 1

1:31338708:show 8





tr로 '\t'를 ':'로 맞춘 후, sort 명령을 사용하면 된다.


 $ cat test | tr '\t' ':' | sort -t ':' -k1,1 -k4,4r

1:31338708:show:8

1:2222999:show:7

1:20954348:show:5

1:11791136:show:3

1:17948015:show:3

1:27647386:show:3

1:12589310:show:2

1:22429745:show:2

1:28222001:show:2

1:10151575:show:1

1:15509090:show:1

1:2343166:show:1

1:24317738:show:1

1:29852663:show:1

2:16981178:show:1

2:17484153:show:1

3:19560507:show:1

3:19670147:show:1

4:21565714:show:1

4:26015409:show:1

5:26972412:show:1

6:27028699:show:1



그러나, 예시는 한 자리 수라 문제가 없다. 만약 2자리 수라면 숫자 정렬에 이슈가 생긴다.


$ cat  > test

1:10151575:show 95

1:11791136:show 948

1:12589310:show 2

1:15509090:show 1

2:16981178:show 1

2:17484153:show 1

1:17948015:show 3

3:19560507:show 1

3:19670147:show 1

1:20954348:show 5

4:21565714:show 1

1:2222999:show 7

1:22429745:show 2

1:2343166:show 1

1:24317738:show 1

4:26015409:show 1

5:26972412:show 1

6:27028699:show 1

1:27647386:show 3

1:28222001:show 2

1:29852663:show 1

1:31338708:show 8



아까와 같은 방식으로 하면 문제가 발생한다. 문자로 인식하면서 발생한 것인데, 95가 948보다 크게 잡힌다. 


$ cat test | tr '\t' ':' | sort -t ':' -k1,1 -k4,4r

1:10151575:show:95

1:11791136:show:948

1:31338708:show:8

1:2222999:show:7

1:20954348:show:5

1:17948015:show:3

1:27647386:show:3

1:12589310:show:2

1:22429745:show:2

1:28222001:show:2

1:15509090:show:1

1:2343166:show:1

1:24317738:show:1

1:29852663:show:1

2:16981178:show:1

2:17484153:show:1

3:19560507:show:1

3:19670147:show:1

4:21565714:show:1

4:26015409:show:1

5:26972412:show:1

6:27028699:show:1



numberic value로 여기는 -n 옵션을 추가해야 숫자로 판단하고 의도한 정렬을 볼 수 있다.


$ cat test | tr '\t' ':' | sort -t ':' -k1,1 -k4,4rn

1:11791136:show:948

1:10151575:show:95

1:31338708:show:8

1:2222999:show:7

1:20954348:show:5

1:17948015:show:3

1:27647386:show:3

1:12589310:show:2

1:22429745:show:2

1:28222001:show:2

1:15509090:show:1

1:2343166:show:1

1:24317738:show:1

1:29852663:show:1

2:16981178:show:1

2:17484153:show:1

3:19560507:show:1

3:19670147:show:1

4:21565714:show:1

4:26015409:show:1

5:26972412:show:1

6:27028699:show:1





Posted by '김용환'
,



유닉스 명령어 sort를 이용하여 특정 필드를 기준으로 정렬하는 예시이다.


1 번째, 2 번째 필드 값으로 오름차순 정렬을 설명한다.


echo '

9 2 1 1

5 7 3 1

2 3 4 5

9 8 7 6

2 1 3 1

1 1 1 1

3 5 6 7' | sort -k 1,1 -k 2,2


결과

1 1 1 1
2 1 3 1
2 3 4 5
3 5 6 7
5 7 3 1
9 2 1 1
9 8 7 6




1 번째 필드 오름차순, 2 번째 필드 오름차순 정렬을 설명한다.

echo '
9 2 1 1
5 7 3 1
2 3 4 5
9 8 7 6
2 1 3 1
1 1 1 1
3 5 6 7' | sort -k 1,1 -k 2,2r

결과

1 1 1 1
2 3 4 5
2 1 3 1
3 5 6 7
5 7 3 1
9 8 7 6
9 2 1 1


Posted by '김용환'
,



특정 날짜를 기준으로 며칠전 날짜를 얻어오는 예시인데, 

아래와 같이 하면 안된다. 


dd=`date --date="$GIVEN_DAY" -d "-$i day" +%m`


아래와 같이 코딩하면 된다.


dd=`date "--date=${GIVEN_DAY} -d -${i} day" +%d`




실제 예시 코드이다. 

#!/bin/sh

if [ $# -lt 3 ]; then
echo 1>&2 "$0: not enough arguments [usage] shell-script.sh YEAR MONTH DAY"
exit 2
fi

YEAR=$1
MONTH=$2
DAY=$3
NUM_DAYS=$4

GIVEN_DAY=`echo ${YEAR}${MONTH}${DAY}`
INPUTS=()
for (( i=0 ; i<$NUM_DAYS ; i++ ))
do
yyyy=`date "--date=${GIVEN_DAY} -d -${i} day" +%Y`
mm=`date "--date=${GIVEN_DAY} -d -${i} day" +%m`
dd=`date "--date=${GIVEN_DAY} -d -${i} day" +%d`
INPUTS+=("$yyyy/$mm/$dd")
done

for input in "${INPUTS[@]}"
do
echo $input
done


$ sh test.sh 2016 02 02 3

2016/02/02

2016/02/01

2016/01/31






Posted by '김용환'
,


jq는 커맨드라인 json 프로세서이다.


설치는 brew와 소스 설치(https://github.com/stedolan/jq)가 가능하다.

$ brew install jq



예시1)

$ curl 'http://search.twitter.com/search.json' | jq '.'

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

100   156  100   156    0     0    179      0 --:--:-- --:--:-- --:--:--   179

{

  "errors": [

    {

      "message": "The Twitter REST API v1 is no longer active. Please migrate to API v1.1. https://dev.twitter.com/docs/api/1.1/overview.",

      "code": 64

    }

  ]

}



예시2)

트웸프록시의 json 결과 예쁘게 출력하기

$ telnet 127.0.0.1 22222 2> /dev/null | tail -n 1 | jq '.'


{

  "service": "nutcracker",

  "source": "Samuelui-MacBook-Pro.local",

  "version": "0.4.1",

  "uptime": 208,

  "timestamp": 1455010088,

  "total_connections": 7,

  "curr_connections": 5,

  "beta": {

    "client_eof": 0,

    "client_err": 0,

    "client_connecti

....



Posted by '김용환'
,


bash에서 자리수에 맞춰 빈 자리는 0으로 채우는 예시이다.

보통은  seq를 생각할 수 있다.


보통은 seq로는 빈 자리를 채우지 않는다. 

$ seq  1 10

1

2

3

4

5

6

7

8

9

10



seq의 -f 옵션의 "%02g"를 사용했다.


$ start=0; end=10; for i in `seq -f "%02g" $start $end` ; do  echo $i ; done;

00

01

02

03

04

05

06

07

08

09

10



더 좋은 방법은 -w 옵션을 사용하면 된다.

$ seq -w 1 10

01

02

03

04

05

06

07

08

09

10





Posted by '김용환'
,



alien(deps)을 이용한다.



$sudo apt-get install alien dpkg-dev debhelper build-essential


$sudo alien -k --script jdk-8u72-linux-x64.rpm


$sudo dpkg -i jdk1.8.0-72_1.8.072-fcs-1_amd64.deb




Posted by '김용환'
,


우분투에서 설치작업 시 /usr/sbin/alternatives: No such file or directory와 같은 에러 메시지를 받았다.



find: `/usr/java/*': No such file or directory

/var/lib/dpkg/info/jdk1.8.0-72.postinst: line 641: /usr/sbin/alternatives: No such file or directory

/var/lib/dpkg/info/jdk1.8.0-72.postinst: line 653: /usr/sbin/alternatives: No such file or directory



아래와 같이 바꾸니 잘 동작한다.


$ cd /usr/sbin/ && sudo ln -s update-alternatives alternatives






Posted by '김용환'
,