Hatena::ブログ(Diary)

kaishitaeiichiの日記

2012-04-27 MySQL コマンド

MySQL コマンド

接続

mysql db_name -u root -p --no-beep --local-infile

データベース確認

show databases;

作業するデータベースの選択

use db_name;

データベース作成

CREATE DATABASE db_name DEFAULT CHARSET utf8;

権限付与

grant all on db_name.* to user_name@localhost identified by 'user_password';
grant file on *.* to user_name@localhost;

テーブル作成

mysql> create table posts (
    ->     id integer NOT NULL AUTO_INCREMENT,
    ->     name varchar(255),
    ->     title varchar(255),
    ->     content text,
    ->     created_at datetime NOT NULL,
    ->     updated_at datetime NOT NULL,
    ->     PRIMARY KEY (id)
    -> );
Query OK, 0 rows affected (0.08 sec)

2011-09-01 sedと¥と’と”でどはまりした。

sedと\と'と"でどはまりした。

$ echo 'pattern' | sed 's/pattern/[0-9]\{8\}/'
[0-9]{8}
$ echo 'pattern' | sed 's/pattern/[0-9]\\{8\\}/'
[0-9]\{8\}
$ echo 'pattern' | sed "s/pattern/[0-9]\\\\{8\\\\}/"
[0-9]\{8\}

なぬ?


$ echo "\\"
\
$ echo '\'
\

そういうことかよ。sedだけでなくて、'と"の挙動のちがいか。

シェルの基本的な理解も足りなかったっぽい。とほほ。

2011-01-07 Windows バッチファイル

Windows バッチファイル


文字列操作

文字列の部分を取り出す

C:\Windows\System32>set stringop=abcdefg

C:\Windows\System32>echo %stringop%
abcdefg

C:\Windows\System32>echo %stringop:~3,2%
de

日時

Windowsのバッチスクリプトの場合、bashみたいに、date関数があるわけでなくて、環境変数dateとtimeで取得する。

C:\>echo %date% %time%
2011/03/19  0:17:53.29

C:\Windows\System32>echo %date% %time%
2011/03/19  0:20:41.59

for

便利な機能もあるのだけど、どうもシンプルでないな。

helpを何度も見ないと、とてもあつかえる気がしない。

for-L-examples.cmd

@echo off
for /L %%i in (0, 1, 3) do echo %%i

for /L %%i in (10, 5, 30) do (
    echo %%i
)

rem 変数名がabのように2文字以上になるとエラー
for /L %%ab in (0, 1, 3) do echo %%i

実行すると

0
1
2
3
10
15
20
25
30
%ab の使い方が誤っています。

for-F-examples.cmd

@echo off
rem for /FをつかうとCSVのような書式のテキストを処理できる

call :cat a.txt
call :cat b.txt
call :cat c.txt
call :countline a.txt
call :countline b.txt
call :countline c.txt

rem ここでexitしないとこれ以降の行も実行されてしまう
exit /b

:cat

rem :区切りのCSVを処理する
rem 1番目のフィールドを%%aで取得できる
rem 2番目以降のフィールドを%%bで取得できる
for /F "delims=: tokens=1,2*" %%a in ('findstr /n "^" %1') do (
    @echo %%a %%b
)

@rem ここでexitしないとこれ以降の行も実行されてしまう
exit /b

:countline

setlocal enabledelayedexpansion
set COUNT=0
rem findstr /n "^"これは、cat -n
for /F "delims=:" %%a in ('findstr /n "^" %1') do (
    set /a COUNT=!COUNT!+1
)
echo !COUNT! 
endlocal

exit /b

参考

findstrコマンドだと、行数が何万行、何十万行もあると、とても処理に時間がかかる。

コマンドライン リファレンス

2010-11-16 Linuxコマンド

Linuxコマンド

vi(vim)

Linuxをおぼえるときは、コマンドもそうだけど、vi(vim)の使い方をおぼえるのが大事な気がする。

サーバやらツールのやらの設定ファイルの編集がスムーズにできないと、それだけでいやになってしまうので。

自分は、まずは、Windows版のvimで使い方をおぼえた。5時間×2日で、自転車の練習のようにおぼえた。正直、これだけではまだまだ慣れるまではいかないのだけど、手は動くようになる。メモをつくりながら、便利な操作をどんどん調べて、使っていくとよいとおもう。

基本の操作
  • 行番号を表示する。
    • :set number
  • 指定した行へ移動する。
    • 最後の行へ
      • G
    • 10行目へ
      • 10G

何単位で何をするのか?を意識することが必要。

単位と処理を組み合わせる。

  • 文字単位の処理
    • 現在のカーソル位置から6文字削除右へ
      • 6dl
  • 単語単位の処理
    • 現在のカーソル位置から9単語移動右へ
      • 9w
  • 行単位の処理
    • 現在のカーソルのある行をヤンク(コピー)
      • :yy
    • 10行目をヤンク(コピー)
      • :10y
    • 21行目から30行目をヤンク(コピー)
      • :21,30y
      • ヤンクしたものを貼り付けるは、pまたはP
    • 31行目から40行目をを置換
      • :31,40s/abc/efg/g
  • 全行の処理
    • 全行を置換
      • 全行を表す記号は%
      • :%s/abc/efg/g
      • :%s;/pqr;/stu;g(置換する単語に/を含む場合は、/ではない単語で区切る。ここでは、;)

文字コード指定
ファイルを開くとき
vim "+e ++enc=文字コード ファイル名"
ファイルを開いているとき
:e ++enc=文字コード

参考

Vim — KaoriYa

Windows版を配布してくれている。vimrcの設定も参考になる。

Vim 基本操作まとめ - Archiva

コーディングを3倍速くする! Vim入門/比留間 和也(カヤック) on Vimeo




ファイル

ls
  • ls -ltr
    • タイムスタンプの逆順でソートして表示
    • このオプションだとファイルが多いディレクトリで、今、更新したファイルが下に表示されるので、更新したファイルを確認しやすい。
  • ls -l --time-style=+'%Y-%m-%d %H:%M:%S'
    • タイムスタンプ表示のフォーマットを指定

basename
eiichi@ubuntu-desktop:~/test$ basename /home/eiichi/test/a.txt 
a.txt

bashだったら、シェルスクリプト中で

FILE_NAME=$(basename $0)
dirname

eiichi@ubuntu-desktop:~/test$ dirname /home/eiichi/test/a.txt 
/home/eiichi/test

bashだったら、シェルスクリプト中で

DIR_PATH=$(dirname $0)

ただし、シェルスクリプトの呼び出し方によって、$0の値は変わるので注意

ためしに、作業ディレクトリ/bin/get-path.shを作成する。

#!/bin/bash

echo $0

実行すると、

  • 相対パスで実行
  • フルパスで実行
  • コマンドパスに通してで実行

で、$0の値は変わる。

eiichi@ubuntu-desktop:~/Programming/shellscripts$ bin/get-path.sh 
bin/get-path.sh
eiichi@ubuntu-desktop:~/Programming/shellscripts$ $(pwd)/bin/get-path.sh 
/home/eiichi/Programming/shellscripts/bin/get-path.sh
eiichi@ubuntu-desktop:~/Programming/shellscripts$ PATH=$PATH:$(pwd)/bin
eiichi@ubuntu-desktop:~/Programming/shellscripts$ get-path.sh 
/home/eiichi/Programming/shellscripts/bin/get-path.sh

readlink

フルパスを取得するためには、

readlink -f ファイルパス

コマンドを検索

which

ファイルを検索

find

ファイルの検索ではとても便利。検索条件を指定するためのオプションが豊富。重い処理になることもあるので、サーバで実行するときは

注意

  • find . -name 検索ファイル名 -print
    • 名前で検索
  • find . -type d -print
    • ディレクトリのみ
  • find . -size +NNNN -print
    • ファイルサイズがNNNN以上

grepと組み合わせると、さらにファイル名を正規表現で抽出できる。

xargsと組み合わせると、検索したファイルに対して、削除など、なんらかの処理を実行できる。

  • find /home/eiichi/ -name '*.txt' | grep -E 'shellscripts' | xargs -I% cp % backup/
    • %は、置換文字列
locate

高速な検索ができる。

ただし、事前に

updatedb

の実行が必要。

ファイルの中の文字列を検索

grep
  • grep 検索文字列 ファイルパス
  • grep -n 検索文字列 ファイルパス
    • 行番号表示
  • grep -o 検索文字列 ファイルパス
    • マッチした文字列を含む行じゃなくて、マッチした文字列のみを表示
  • grep -v 検索文字列 ファイルパス
    • 検索文字列を含まない行にヒット
  • grep -r 検索文字列 .
    • 検索対象ファイルを絞り込んだ上で、ファイルの内容について、grepしたいなら、以下のようなコマンドかな
      • find . -type f -print | xargs grep 検索文字列
  • grep -E
    • grepは、検索文字列に、正規表現がつかえる。しかし、オプションなしのデフォルトの正規表現よりは、拡張正規表現をつかったほうが、\でエスケープとしなくてすんだり、便利。


ファイルを圧縮および解凍

tar

圧縮

$ ls -la aaaa/bbbb/cccc/
合計 8
drwxr-xr-x 2 eiichi eiichi 4096 2012-10-25 23:54 .
drwxr-xr-x 3 eiichi eiichi 4096 2012-10-25 23:53 ..
-rw-r--r-- 1 eiichi eiichi    0 2012-10-25 23:54 xxxx.txt
-rw-r--r-- 1 eiichi eiichi    0 2012-10-25 23:54 yyyy.txt

$ tar cvfz cccc.tar.gz -C aaaa/bbbb/cccc .
./
./yyyy.txt
./xxxx.txt
$ tar cvfz cccc.tar.gz -C aaaa/bbbb cccc
cccc/
cccc/yyyy.txt
cccc/xxxx.txt

展開

$ tar xvfz cccc.tar.gz 
cccc/
cccc/yyyy.txt
cccc/xxxx.txt
$ ls -la cccc
合計 8
drwxr-xr-x  2 eiichi eiichi 4096 2012-10-25 23:54 .
drwxr-xr-x 17 eiichi eiichi 4096 2012-10-25 23:58 ..
-rw-r--r--  1 eiichi eiichi    0 2012-10-25 23:54 xxxx.txt
-rw-r--r--  1 eiichi eiichi    0 2012-10-25 23:54 yyyy.txt
$ tar xvfz cccc.tar.gz -C eeee/ffff/
cccc/
cccc/yyyy.txt
cccc/xxxx.txt
$ ls -la eeee/ffff/cccc/
合計 8
drwxr-xr-x 2 eiichi eiichi 4096 2012-10-25 23:54 .
drwxr-xr-x 3 eiichi eiichi 4096 2012-10-26 00:00 ..
-rw-r--r-- 1 eiichi eiichi    0 2012-10-25 23:54 xxxx.txt
-rw-r--r-- 1 eiichi eiichi    0 2012-10-25 23:54 yyyy.txt


gzip


ドキュメントを検索



ファイル名の一括変更

for f in $(ls | grep 20110901); do mv $f $(echo $f | sed 's/20110901/20110831/'); done

rename 's/20110831/20110830/' *

文字列の処理

sed

置換して、ファイルの内容はそのまま

sed -e 's/aaaa/bbbb/g' ファイルパス

置換して、ファイルの内容を上書き

sed -i 's/aaaa/bbbb/g' ファイルパス

後方参照

$ echo '123abc456' 
123abc456
$ echo '123abc456' | sed -e 's/\([0-9]\+\)\(.[a-z]\+\)\([0-9]\+\)/\1 \3/g'
123 456
perl

クォーテーションを、後方参照で取り除いてみる

$ echo "'a'" 
'a'
$ echo "'a'" | perl -i -p -e "s/'(.+)'/\$1/g"
a
$ echo '"a"' 
"a"
$ echo '"a"' | perl -i -p -e 's/"(.+)"/$1/g'
a

cut
  • echo 'aaaa:bbbb:cccc' | cut -d':' -f1,3
awk

CSVファイルの読み込み

cat awk-test.csv 
11,12,13,14
21,22,23,24
31,32,33,34

awk  -F',' '{print $2":"$3}' awk-test.csv 
12:13
22:23
32:33


10個おきに改行する。awkでは、NRは行番号を表している。

seq 1 20 | awk 'NR % 10 == 0 {printf("%s\n", $0)} NR % 10 != 0 {printf("%s ", $0)}'
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20

シェルスクリプト中で、シェル変数をわたす

with-awk.sh

#!/bin/bash

LEFT_DECO="****++++"
RIGHT_DECO="+++++****"

awk -v LD="$LEFT_DECO" -v RD="$RIGHT_DECO" '{print LD" "$0" "RD}' test.txt

test.txt

aaaaaaa
bbbbbbb
ccccccc
ddddddd
eiichi@ubuntu-desktop:~/Programming/shellscripts$ ./with-awk.sh 
****++++ aaaaaaa +++++****
****++++ bbbbbbb +++++****
****++++ ccccccc +++++****
****++++ ddddddd +++++****





何かの数を数える

wc
  • 行数を数える。
    • wc -l
  • 同じ行にabcという単語が含まれている場合は、まずgrep -oをするとよい
    • grep -oE 'abc' | wc -l
  • 拡張子がtxtのファイル数の数だったら、
    • ls *.txt | wc -l

ソート

eiichi@ubuntu-desktop:~$ seq 1 15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

-rで逆順にする。

eiichi@ubuntu-desktop:~$ seq 1 15 | sort -r
9
8
7
6
5
4
3
2
15
14
13
12
11
10
1

たしかにソートされてるんだけど、期待と違う。

-nオプションをつける

eiichi@ubuntu-desktop:~$ seq 1 15 | sort -nr
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1

期待通りになった。

日時

date
$ date
2012年 10月 25日 木曜日 00:01:24 JST
$ date +'%Y-%m-%d %H:%M:%S'
2012-10-25 00:01:32
$ date -d '2013-01-02 12:34:56' +'%Y%m%d%H%M%S'
20130102123456
$ date -d '2013-01-02 12:34:56 5 days' +'%Y%m%d%H%M%S'
20130107123456
$ date -d '2013-01-02 12:34:56 2 months ago' +'%Y%m%d%H%M%S'
20121102123456

日時を比較したいときは、エポックからの秒数になおす

$ A=$(date +'%s')
$ B=$(date +'%s')
$ echo $A
1351091129
$ echo $B
1351091135
$ test $A -lt $B 
$ echo $?
0
$ test $A -eq $B 
$ echo $?
1
$ test $A -gt $B 
$ echo $?
1


フォーマット

printf

printfが使えるようだ。

eiichi@ubuntu-desktop:~$ seq 1 4 
1
2
3
4

eiichi@ubuntu-desktop:~$ seq 1 4 | xargs printf %02d\\n
01
02
03
04

xargs

find . -type f -print0 | xargs -0 mv -t to-dir




文字コード

  • file ファイルパス
    • 改行コードが、LFならば、なにも表示しない。
    • 改行コードが、CR+LFならば、そのように表示してくれる。
  • nkf -g ファイルパス
特に、改行コード
  • od -c
    • 改行コード用じゃないんだけど、改行コードも見やすく表示される

文字コード変換

nkf
  • nkf -Jw iso-2022-jpのファイル > UTF-8のファイル
  • find . -name '*.java' | xargs nkf -Sw --in-place
    • 文字コードをShift_JISからUTF-8にして、元のファイルを上書き

ユーザ管理

useradd
usermod
  • usermod -g グループ名 ユーザ名
    • デフォルトのグループを変更
  • usermod -G グループ名 ユーザ名
    • グループにこのユーザを追加

cat /etc/group

で確認

userdel

指定したタイミングで実行

cron
  • いつ、どのコマンドを実行したいのか設定ファイルに記述して利用する
  • cron本体のプロセスは、root権限で実行されるが、個々の処理は、該当ユーザの権限で実行される。
    • cronの設定ファイル自体がユーザごとに用意される。
  • 設定ファイルの編集
    • 実行したいユーザになって、以下のコマンドで、設定ファイルを編集する。
      • crontab -e
    • 設定ファイルには、PATHのような、変数も記述できる。
    • デフォルトの設定ファイルは以下なのか?
      • /etc/crontab
  • 前の処理が処理中でも、次の処理が実行されてしまうので注意
    • たとえば、10分おきに、あるバッチ処理を実行する。このとき、このバッチ実行に15分かかったとする。この場合、前のバッチ処理を継続したまま、次のバッチ処理を実行となるので、処理が重ならないようにするための工夫が必要
      • よくあるのは、ロックファイルか?
        • タイムアウトなどの検討が必要
      • cron使わないで、バッチ処理が正常終了したときだけ、atコマンドで、次回実行の分だけを設定とかもありなのかもしれない。でもこれだと、初回実行とか異常終了したときの対応がめんどう。

cron以外にも、同様のソフトがある。

ジョブ管理システム

ジョブ管理システム - Wikipedia

探せば、まだありそう

Java

Quartz Scheduler | Documentation | Quartz 2.1.x: Quick Start

at
watch

watch -n 1 -x uptime

watch -n 1 -dc uptime

uptimeコマンドを1秒おきに実行

  • dcだと、差分をハイライトしてくれるので、変化したことがわかりやすい。

ディスク

df
du

du -h

ハードやOS

/proc配下を見る

cd /proc

#CPU

cat cpuinfo

#OS

cat version


uname

uname -a

状態確認

sysstatパッケージをあらかじめ導入しておく。

たとえば、

sudo apt-get install sysstat

システム関連のデータなので、

/proc

の値を直接見ることもできるが、コマンドをたたいたほうが、利便性がよい。

ps
top
iostat
uptime
w
free
vmstat
sar

マルチコア時代のロードアベレージの見方 - naoyaのはてなダイアリー

第3回 システムの情報を集める | Think IT

サーバが重いってどういうこと? | Think IT


Subversion

Subversionのメモ  - kaishitaeiichiの日記

トラブルシューティング

原因調査用Linuxコマンド | 外道父の匠