[jq] 쉘에서의 JSON 처리: jq 사용법

맥에서 설치는 다음과 같다. 우분투는 아마도 apt-get install 을 사용할 것이다.

$ brew install jq

사용법은 값을 얻고 싶은 필드 키를 주면 된다. 뒤에 입력 파일 이름을 주지 않으면 stdin을 입력으로 받는다.

jq “.key” [intput filename]

따라서 curl 이나 echo, cat 등으로 출력을 파이프로 넘겨서 stdin 입력으로 jq에 넘겨서 원하는 데이터를 얻으면 된다. 예를 들어 다음과 같은 데이터를 curl을 통해 얻었다고 하자.

$ curl -X POST "https://login.dasomoli.org/login/2fa" -H "accept: application/json;charset=UTF-8" -H "X-AUTH-MOBILE: true" -H "Content-Type: application/json;charset=UTF-8" -d "{ \"otpCode\": \"123456\", \"password\": \"PASSWORD\", \"userId\": \"dasomoli\"}"
{
  "resultCode": "success",
  "resultMessage": "Successful",
  "data": {
    "accessToken": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJqdXN0aW55IiwiaW5mbyI6eyJ1c2VySWQiOiJqdXN0aW55IiwibmFtZSI6Ikp1c3RpbiIsImFjY291bnQiOiIweEY2NTUwZTk4ZTVDZUFiRjVkRmQ4NTcxYzY3MGI1Zjg0M0U4OTMzNzAiLCJzeW1ib2wiOiJLU1RBX0RFViIsImVtYWlsIjoianVzdGluLnlhbmdAY3J5cHRlZC5jby5rciIsImxvZ2luVGltZSI6MH0sInJvbGVzIjoiUk9MRV9VU0VSIiwiaWF0IjoxNjk3NDQxMTY3LCJleHAiOjE2OTc0NDQ3Njd9.XVT7RIKybB0hgYzcJvZx9voGlolza83RrxuCsK0i-vo",
    "refreshToken": "eyJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2OTc0NDExNjcsImV4cCI6MTY5ODA0NTk2N30.auHUC75qf-Xz--e8JAKvtosaYnUB_Hx5-RKTUZyC-ZM"
  }
}

여기서 data 안에 있는 accessToken 값을 얻고 싶다면, 다음과 같이 하면 된다.

$ curl -X POST "https://login.dasomoli.org/login/2fa" -H "accept: application/json;charset=UTF-8" -H "X-AUTH-MOBILE: true" -H "Content-Type: application/json;charset=UTF-8" -d "{ \"otpCode\": \"123456\", \"password\": \"PASSWORD\", \"userId\": \"dasomoli\"}" | jq ".data.accessToken"

쉘 스크립트 내에서 위의 값을 ACCESS_TOKEN 이라는 변수에 넣었을 때, 앞 뒤로 붙는 ” 문자를 없애고 싶다면 다음과 같이 한다.

ACCESS_TOKEN="${ACCESS_TOKEN//\"/}"

[Linux][bash] git branch를 prompt에 넣기

~/.bashrc 에 다음을 추가.

parse_git_branch() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ "
#  PS1="${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\]$ "

[Linux] mysql 복구 script

mysql이 자꾸 죽으면서 워드프레스가 DB연결을 못하고 자꾸 에러를 띄운다.

InnoDB memory pool size가 기본으로 128M로 되어 있는데, 이걸 할당을 못하고 죽는 것 같다.

64M로 줄이자.

# vi /etc/mysql/conf.d/innodb.cnf
[mysqld]
innodb_buffer_pool_size = 64M

 

죽으면 사실 그냥 service mysql restart 해주면 되는데, 요거도 귀찮으니까 돌려서 죽으면 실행하게 스크립트를 만들자

# vi mysqlmon.sh
#!/bin/bash

linecount=`ps -aux | grep /usr/sbin/mysqld | wc -l`

if [ "$linecount" = "2" ]; then
        echo "`date`: Working well" >> /var/log/mysqlmon/mysqlmon.log;
else
        echo "`date`: Trying to recover..." >> /var/log/mysqlmon/mysqlmon.err;
        service mysql restart;
        echo "`date`: Done" >> //var/log/mysqlmon/mysqlmon.err;
fi

 

crontab에 등록하자

# crontab -e
*/5 * * * * /root/mysqlmon.sh

 

log파일을 관리하도록 [Linux] logrotate 설정 글의 예제처럼 logrotate를 설정하자.

[Windows] Command Prompt의 Current Code page 변경

Windows에서 명령줄을 띄워서 작업할 때, 어떤 에러 메시지 등을 google에서 찾아보고 싶은 경우 같은 때, 나오는 메시지의 언어를 바꾸고 싶을 때가 있다. 이럴 때 “LANG” 환경 변수 등을 바꾸어도 그대로 에러 메시지 등이 우리말로 나온다. 요건 mingw 같은 환경에서 shell을 써도 마찬가지. 한국판 Windows를 깔면 기본이 CP949로 설정되어 에러 메시지 등이 우리말로 나오는 것인데, 다음과 같이 CHCP 명령을 이용하면 된다. 65001은 UTF-8이다.

CHCP 65001

참고: https://superuser.com/questions/269818/change-default-code-page-of-windows-console-to-utf-8

[Python] BeautifulSoup/requests 모듈, shell script로 네이버 금시세 기록하기

금 시세 기록을 위해 만든 python 스크립트

1. BeautifulSoup을 설치하자.

$ sudo apt-get install python-bs4

2. 네이버 금시세를 얻어와서 출력하자. Text file로 만들거니까..

# gold.py
import requests
from bs4 import BeautifulSoup
page = 1
while (1):
        reqstr = 'http://info.finance.naver.com/marketindex/goldDailyQuote.nhn?page=' + str(page)
        req = requests.get(reqstr)
        html = req.text
        soup = BeautifulSoup(html, 'html.parser')
        my_date = soup.select(
                'body > div > table > tbody > tr > td:nth-of-type(1)'
                )
        my_values = soup.select(
                'body > div > table > tbody > tr > td:nth-of-type(2)'
                )
        if (len(my_values) <= 0):
                break
        row = 0
        for title in my_values:
                print(my_date[row].text + '\t' + title.text)
                row = row + 1
        page = page + 1

3. 매일 실행시키려면, crontab 등록을 위해 shell script를 하나 만들자

#/bin/sh

python /home/dasomoli/src/gold.py > /mnt/NAS/Data/Gold/`date +%F`.txt

4. crontab에 등록하자

$ crontab -e

0 1 * * * /home/dasomoli/src/record_gold.sh

 

DB만들어서 기록하면, 한번 요청으로 끝나겠지만 귀찮고, 육아로 시간이 없으므로 오늘은 여기까지!

[Android] adb & fastboot 관련 명령 정리

자주 쓰는 명령 몇 개만 정리하자.

adb shell [명령] : shell 또는 명령 실행(‘cat /proc/kmsg’ 라던가..)
adb reboot :  reboot
adb reboot [bootloader | recovery] : reboot & [fastboot | recovery]모드 들어가기
adb logcat [TAG:LEVEL] [*:S] : logcat, 특정 TAG를 LEVEL(S,V,I,D,…)로 보기, *:S 넣으면 나머지는 Silent.
adb root : root 로 adbd 재실행
adb remount : system 파티션을 rw로 remount
adb push, pull : 파일 넣기, 빼오기, read/write 시스템 콜 이용으로도 사용 가능.
adb wait-for-devices [명령] : adb 연결 기다렸다 명령 실행
adb devices : 붙었나?
adb sideload <파일이름.zip> : OTA패키지인 파일이름.zip 을 adb 를 통해 업데이트. JB부터 추가

fastboot flash <파티션 이름> <파일명> : 파티션 이름에는 bootloader, boot, zimage, ramdisk, system, userdata, cache, recovery 등이 올 수 있다.
fastboot wait-for-devices : 윈도우즈는 그냥 명령 주면 대기하므로 필요없다. 리눅스용에서 사용.
fastboot [-w] flashall : 윈도우즈에서는 “set ANDROID_PRODUCT_OUT=D:\out\target\product\crespo” 해두고 하면 된다. -w 옵션주면 userdata 등 파티션 날리고 모두 flash
fastboot [-w] update <zip 파일이름> : update용 zip 파일(make updatepackage로 생성)로 업데이트, 역시 -w 옵션 주면 나머지 날림.
fastboot reboot-bootloader : fastboot 모드로 reboot
fastboot reboot : reboot.
fastboot getvar <Variable> : Variable 을 얻어옴. 전체는 all(“fastboot getvar all”)
fastboot devices : 붙었나?
 

[Linux] Shell script 에서 문자열 다루기

참고에 매우 자세히 잘 정리되어 있다. 감사.

문자열 길이 구하기
${#string}

문자열 추출
${string:position}
${string:position:length}

문자열 조각 삭제
${string#substring}
 string의 앞에서부터 가장 짧게 일치하는 substring 제거
${string##substring}
 string의 앞에서부터 가장 길게 일치하는 substring 제거

${string%substring}
 string의 뒤에서부터 가장 짧게 일치하는 substring 제거
${string%%substring}
 string의 뒤에서부터 가장 길게 일치하는 substring 제거

참고 : 
http://wonylog.tistory.com/192

[Linux] shell 에서 메일 보내기

이용 가능한 SMTP가 있는 경우 shell 에서도 메일을 보낼 수 있다. 쉘 스크립트 상에서 메일을 보내거나 할 때 유용하다. 가장 편한 방법이 sendemail 을 이용하는 것 같다.
다음과 같이 하면 된다. 아래 예제는 무인증 SMTP를 이용할 경우의 예제이다.

$ sendEmail -f “보내는이@메일” -s <SMTP 서버 주소> -t “받는이@메일” -u “메일 제목” -m “메일 내용”

Perl script 를 이용해서도 간편히 보낼 수 있는데, 예제는 다음과 같다.

#!/usr/bin/perl -w
use Net::SMTP;
$smtp = Net::SMTP->new(‘<SMTP 서버 주소>’);
$smtp->mail(‘보내는이@메일’);
$smtp->to(‘받는이@메일’);
$smtp->data();
$smtp->datasend(“To: dasomoli\n”);
$smtp->datasend(“Subject: A simple test mail subject\n”);
$smtp->datasend(“\n”);
$smtp->datasend(“A simple test message\n”);
$smtp->datasend(“A simple test message 2\n”);
$smtp->dataend();
$smtp->quit;

한글 메일을 보내고 싶으면 perl 스크립트로 아래와 같이 MIME::Lite 를 사용하면 된다.

$ sudo apt-get install libmime-lite-perl

#!/usr/bin/perl -w
use MIME::Lite;
### Create a new multipart message:
$msg = MIME::Lite->new(
                From    => ‘보내는이@메일’,
                To      => ‘받는이@메일’,
                Subject => ‘Hangul test’,
                Data    => ‘한글’,
                );
$msg->attr(‘content-type.charset’ => ‘UTF-8’);
### Add parts (each “attach” has same arguments as “new”):
### use Net:SMTP to do the sending
$msg->send(‘smtp’, ‘<SMTP 서버 주소>’, Debug=>1 );

참고 : 
http://nixcraft.com/shell-scripting/11895-shell-script-send-email-via-smtp-username-password.html
http://caspian.dotconf.net/menu/Software/SendEmail/
http://perldoc.perl.org/Net/SMTP.html
http://search.cpan.org/~rjbs/MIME-Lite-3.028/lib/MIME/Lite.pm

Shell script 에서 자주 쓰는 명령들

처음 시작은
#!/bin/sh

Perl 처음 시작은
#!/usr/bin/perl -w

argument는 $0 $1 $2 …
argument 처리는 아래 형식.

for ARGUMENT in “$@”; do
case $ARGUMENT in
–commit)
COMMIT=$2;
;;
–uploader)
UPLOADER=$2;
;;
–branch)
BRANCH=$2;
;;
–patchset)
PATCHSET_ID=$2;
;;
–change-url)
CHANGE_URL=$2;
CHANGE_NO=`basename $CHANGE_URL`;
;;
esac
shift;
done

Perl에서 Argument 처리는
$ARGV[0], $ARGV[1], $ARGV[2]… $#ARGV 는 argument 개수
 

공백으로 나눠진 파라미터 프린트
gawk ‘{print $1}’

/로 나눠진 마지막 파라미터 프린트. cut 도 사용가능
gawk -F / ‘{print $NF}’

파일명 얻기는
basename 경로명

디렉토리명 얻기는
dirname 경로명

절대경로 얻을 때는
readlink -e 상대경로

특정 문자열 치환은
sed -e “s/문자열/문자열/g”

if는 이런 형식. 비교식은 http://www.gnu.org/s/bash/manual/bash.html#Bash-Conditional-Expressions 참고

if [ “$변수” = “” ]; then
  명령;

elif
  명령;
else
  명령;
fi

for each 는 이런 형식

for 변수 in $가져올변수
do
  echo “$변수”
done

case는 위의 argument 처리 참고.

명령의 결과 저장은 `명령`
변수의 값으로 치환한 문자열은 “$변수 포함 문자열”
그냥 그대로 문자열은 ‘문자열’

끝에만 자를 땐
tail -n 숫자

앞에만 자를 땐
head -n 숫자

문자열 있는 줄만 얻고 싶을 땐
grep “문자열”

정규식으로 찾은 문자열 포함된 줄만 얻고 싶을 땐
grep -P “^문자열[0-9a-zA-Z-_/]*$”

basic http 인증은 https://wiki.jenkins-ci.org/display/JENKINS/Authenticating+scripted+clients 참고

html 얻어올 때는
curl “주소”