狠狠撸

狠狠撸Share a Scribd company logo
長谷川 
1
シェルの紹介に触発されて。 
Windows環境しか使わない場合でもシェルを覚えて 
いて損はないということの周知。 
2
1. WindowsでUnix環境を使おう 
2. よく使うシェルと使うシチュエーション 
? 結構すぐ使えるシェル 
今日はこっちを紹介します。 
? やや技巧的なシェル 
? 技巧的なシェル 
技巧的なシェルは特定業務に特化してしまうので後 
回し 
3
4 
? cygwinのインストール 
? 環境設定 
※cygwinとはWindows上で動作するUnixライクな環境。 
※そのうちPowerShellの紹介もしたい。
下記からインストーラーをダウンロードしてインストー 
ルする。 
https://www.cygwin.com/ 
必要なパッケージを選択してインストールする。 
後で追加もできる。 
5
実行画面はUnix環境っぽい感じ。 
ディレクトリなどが自動的に作られる。 
Windowsから楽に使えるように環境設定する。 
6
DOS画面からcygwinのコマンドを使えるようにする。 
PATHにcygwinのbinのパスを追加。 
SET PATH=%PATH%;C:cygwinbin 
下線はcygwinをインストールしたところ。 
DOS画面からcygwinのコマンドが使えるように 
なった! 
7
テク① 
ここに「cmd」と入力してEnterを押すと 
このパスでDOS画面を開けます。 
8
9 
結構すぐ使えるシェル 
①ディレクトリの一覧を取得(DOS) 
②大量のファイルをcsvにする(cygwin) 
③ディレクトリの使用容量(cygwin) 
④csvの特定列の最大値取得(cygwin) 
⑤プロセス多重起動監視(cygwin) 
⑥自動FTP操作(cygwin) 
⑦ネットワーク設定の変更(PowerShell)
TREE 
ドライブやパスのフォルダー構造を図式表示します。 
/F 各フォルダーのファイル名を表示します。 
/A 拡張文字ではなく、ASCII 文字で表示します。 
>TREE /F /A > tree.txt 
C:. 
| classes.dex 
| hello.apk 
| resources.ap_ 
| 
+---classes 
| ---hello 
| ---namespace 
| HelloActivity.class 
| R$attr.class 
| R$drawable.class 
| R$id.class 
パイプ等で使うときはls –Rなどのパス 
のみ表示するコマンドを使う。 
10
【シチュエーション】大量のvmstatのログファイルが 
あってそれを全部csvに変換したい。 
r b swpd free buff cache si so bi bo in cs us sy id wa st 
1 0 128 57012 87772 664448 0 0 12 10 75 68 0 1 98 1 0 
0 0 128 59368 87772 664480 0 0 0 0 189 90 7 4 89 0 0 
0 0 128 59368 87772 664480 0 0 0 0 174 80 4 3 93 0 0 
0 0 128 59368 87772 664480 0 0 0 0 159 90 6 3 91 0 0 
0 0 128 59376 87772 664480 0 0 0 0 139 63 4 3 93 0 0 
0 0 128 59376 87772 664480 0 0 0 0 165 86 4 4 92 0 0 
0 0 128 59376 87780 664480 0 0 0 60 161 80 5 3 92 0 0 
~~~~~ 1万行くらい~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
0 0 128 59376 87780 664480 0 0 0 0 174 92 5 5 90 0 0 
0 0 128 59376 87780 664480 0 0 0 0 144 66 6 3 91 0 0 
0 0 128 59376 87780 664480 0 0 0 0 156 82 5 3 92 0 0 
0 0 128 59376 87780 664480 0 0 0 0 156 77 4 4 92 0 0 
0 0 128 59376 87784 664480 0 0 0 28 163 94 5 4 91 0 0 
0 0 128 59376 87784 664480 0 0 0 0 143 69 4 3 93 0 0 
0 0 128 59376 87784 664480 0 0 0 0 160 81 6 3 91 0 0 
0 0 128 59376 87780 664480 0 0 0 0 144 66 6 3 91 0 0 
0 0 128 59376 87780 664480 0 0 0 0 156 82 5 3 92 0 0 
0 0 128 59376 87780 664480 0 0 0 0 156 77 4 4 92 0 0 
0 0 128 59376 87784 664480 0 0 0 28 163 94 5 4 91 0 0 
0 0 128 59376 87784 664480 0 0 0 0 143 69 4 3 93 0 0 
0 0 128 59376 87784 664480 0 0 0 0 160 81 6 3 91 0 0 
このようなファイルが100個くらいある。 
#getconf ARG_MAX 
32000 ←引数3200個までは大丈夫 
vmstat:実行待ちプロセス数、割り込み回数、消費メモリ、 
カーネル/ユーザ/アイドルのCPU使用率、 
コンテキストスイッチ数などを取得するコマンド。 
11
【コマンド】 
コマンド機能オプションなど意味 
sed 文字列置換。-r 正規表現使用 
s/条件/文字/g 条件を文字列に置換 
find ファイル検索-type f:ファイル、d:ディレクトリ、l:シンボ 
リックリンク 
-name ファイル名のパターン 
-print0 区切り文字を0にする。 
xargs ARG_MAX以 
下になるように 
分割してコマン 
ド実行 
-0 区切り文字を0にする。 
-PN 並列数N。0は最大限の並列化。 
-t コマンドを標準エラー出力。 
-I str strを標準入力の引数に置換。 
12
#!/bin/sh 
0以上の連続するスペースを,に置換し、拡張子 
csvで保存。 
function func() 
{ 
sed -r "s/[ ]+/,/g" "$1" > "$1.csv" 
} 
export -f func 
カレントディレクトリの*.logファイルのパスを引数 
にしてfuncを呼び出す。 
区切り0にしないとパスのスペースで区切られる。 
find . -type f –maxdepth 1 -name "*.log" -print0 | 
xargs -0 -P0 -t -I %arg bash -c "func %arg" 
シングルクォーテーション’?シェル展開しない。 
ダブルクォーテーション”?シェル展開する。 
13
【コマンド】 
コマンド機能オプションなど意味 
du ディスク使用容 
量。 
-m メガバイト単位。 
-k キロバイト単位。 
-h M/K/Gを自動で選択する。 
-s サブディレクトリを除く。 
sort ソート-r 降順でソート。 
-n 数値としてソート。 
-u 重複排除。 
14
C:cygwinusr>du -sk ./* | sort -rn 
409122 ./share 
378867 ./ppc 
343904 ./lib 
166279 ./bin 
63405 ./include 
47820 ./src 
28486 ./i686-pc-mingw32 
2432 ./libexec 
413 ./sbin 
6 ./i686-pc-cygwin 
3 ./ssl 
カレントディレクトリの各ディレクトリの使 
用容量を降順でソート 
Windosのsortが優先される場合があ 
るので注意 
パス検索の順序確認 
>where sort 
C:cygwinbinsort.exe 
C:WindowsSystem32sort.exe 
15
【コマンド】 
コマンド機能オプションなど意味 
awk 
文字列処理用 
(gawk) 
言語。 
-F 区切り文字 
{cmd1} END{cmd2} cmd1:各行で実行 
cmd2:最後に実行 
構文:awk ‘program’ [file ...] 
gawk -F, ‘{print $2 $5}’ xx.csv ?csvの各行の2、5列目を表示。 
gawk -F, ‘{printf “data10:%dn”, $10}’ xx.csv ?data10: dataという出力形式。 
gawk -F, ‘BEGIN{print “START”} 
{printf “data10:%dn”, $10} END{print “END”}’ xx.csv 
?最初にSTART/最後にENDと表示。 
16
gawk -F, ‘{print $5}’ x.csv | sort -nr | head -n 1 
5列目の最大値を表示。 
head –n N:先頭からN行を表示。 
gawk -F, ‘{sum +=$5} END{print sum / NR}’ x.csv 
5列目の平均を表示。 
NR:行数 
※数値以外が含まれる場合の考慮はしていない。 
17
【コマンド】 
コマンド機能オプションなど意味 
ps プロセス表示。aux a:全ユーザー、u:ユーザ名と開始 
時刻、x:全プロセス 
grep 文字列の検索-v マッチしない行を表示。 
-A num 
-B num 
A:マッチ行の前num行を表示。 
B:マッチ行の後num行を表示。 
-E 拡張正規表現(ERE)使用。egrepと 
同様。 
wc 行数などを表 
示。 
-c バイト数をカウント。 
-w 単語数をカウント。 
-l 行数をカウント。 
なし行数、単語数、バイト数をカウント。 
pgrep PIDを取得。-x 完全一致のプロセスのPIDを取得。 
18
#!/bin/sh 
threshold=3 
count=$(ps aux | grep "$1" | 
grep -v "grep" | wc -l) 
if [ "$count" -ge "$threshold" ]; then 
echo "[WARNING]$count" 
fi 
psから引数のプロセスを抽出。 
pgrep –x ”$1”でもよい。 
psからgrepを除き、行 
数を取得。 
プロセス数が閾値以上ならばメッセージを表示。 
watchコマンド、whileなどで定期実行しておく。 
19
【コマンド】 
ヒアドキュメント 
cmd<<xxでcmdにデータを渡すことができる。 
cmd<<-xxとすると行頭のタブが無視される。 
xxを’で囲むと変数、コマンドが展開されない。 
例) 
mail –s ’タイトル’ <<EOF 
メール本文 
EOF 
20
#!/bin/sh 
ftp –n “192.168.100.1” << EOF 
#ftp –n 標準入力からログイン情報を取得。 
user ’hasegawa’ ’password’ 
binary 
#binaryモード 
cd ../ 
mget ”*.log” 
EOF 
ログインしてbinaryモードに切り替えて、 
ログディレクトリに移動して*.logを取得 
する。 
21
PowerShellについては近々紹介予定。 
Windowsの設定を自動化できる。 
C:WINDOWSsystem32WindowsPowerShellv 
1.0 
$adapters=Get-WmiObject -Class 
Win32_NetworkAdapterConfiguration - 
ComputerName. -Filter "IPEnabled='True'“ 
$adapters[0].EnableStatic(“192.168.200.100”,” 
255.255.255.0”) 
22
$ip=@() 
$mask=@() 
$ip+=“1.1.1.1” 
$ip+=”2.2.2.2” 
$mask+=“255.0.0.0” 
$mask+=“255.0.0.0” 
16個IPアドレスを設定するのもスクリ 
プトでやれば簡単 
$adapters[0].EnableStatic($ip, $mask) 
23

More Related Content

奥颈苍诲辞飞蝉でも使えるシェル

  • 3. 1. WindowsでUnix環境を使おう 2. よく使うシェルと使うシチュエーション ? 結構すぐ使えるシェル 今日はこっちを紹介します。 ? やや技巧的なシェル ? 技巧的なシェル 技巧的なシェルは特定業務に特化してしまうので後 回し 3
  • 4. 4 ? cygwinのインストール ? 環境設定 ※cygwinとはWindows上で動作するUnixライクな環境。 ※そのうちPowerShellの紹介もしたい。
  • 5. 下記からインストーラーをダウンロードしてインストー ルする。 https://www.cygwin.com/ 必要なパッケージを選択してインストールする。 後で追加もできる。 5
  • 7. DOS画面からcygwinのコマンドを使えるようにする。 PATHにcygwinのbinのパスを追加。 SET PATH=%PATH%;C:cygwinbin 下線はcygwinをインストールしたところ。 DOS画面からcygwinのコマンドが使えるように なった! 7
  • 9. 9 結構すぐ使えるシェル ①ディレクトリの一覧を取得(DOS) ②大量のファイルをcsvにする(cygwin) ③ディレクトリの使用容量(cygwin) ④csvの特定列の最大値取得(cygwin) ⑤プロセス多重起動監視(cygwin) ⑥自動FTP操作(cygwin) ⑦ネットワーク設定の変更(PowerShell)
  • 10. TREE ドライブやパスのフォルダー構造を図式表示します。 /F 各フォルダーのファイル名を表示します。 /A 拡張文字ではなく、ASCII 文字で表示します。 >TREE /F /A > tree.txt C:. | classes.dex | hello.apk | resources.ap_ | +---classes | ---hello | ---namespace | HelloActivity.class | R$attr.class | R$drawable.class | R$id.class パイプ等で使うときはls –Rなどのパス のみ表示するコマンドを使う。 10
  • 11. 【シチュエーション】大量のvmstatのログファイルが あってそれを全部csvに変換したい。 r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 128 57012 87772 664448 0 0 12 10 75 68 0 1 98 1 0 0 0 128 59368 87772 664480 0 0 0 0 189 90 7 4 89 0 0 0 0 128 59368 87772 664480 0 0 0 0 174 80 4 3 93 0 0 0 0 128 59368 87772 664480 0 0 0 0 159 90 6 3 91 0 0 0 0 128 59376 87772 664480 0 0 0 0 139 63 4 3 93 0 0 0 0 128 59376 87772 664480 0 0 0 0 165 86 4 4 92 0 0 0 0 128 59376 87780 664480 0 0 0 60 161 80 5 3 92 0 0 ~~~~~ 1万行くらい~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 0 0 128 59376 87780 664480 0 0 0 0 174 92 5 5 90 0 0 0 0 128 59376 87780 664480 0 0 0 0 144 66 6 3 91 0 0 0 0 128 59376 87780 664480 0 0 0 0 156 82 5 3 92 0 0 0 0 128 59376 87780 664480 0 0 0 0 156 77 4 4 92 0 0 0 0 128 59376 87784 664480 0 0 0 28 163 94 5 4 91 0 0 0 0 128 59376 87784 664480 0 0 0 0 143 69 4 3 93 0 0 0 0 128 59376 87784 664480 0 0 0 0 160 81 6 3 91 0 0 0 0 128 59376 87780 664480 0 0 0 0 144 66 6 3 91 0 0 0 0 128 59376 87780 664480 0 0 0 0 156 82 5 3 92 0 0 0 0 128 59376 87780 664480 0 0 0 0 156 77 4 4 92 0 0 0 0 128 59376 87784 664480 0 0 0 28 163 94 5 4 91 0 0 0 0 128 59376 87784 664480 0 0 0 0 143 69 4 3 93 0 0 0 0 128 59376 87784 664480 0 0 0 0 160 81 6 3 91 0 0 このようなファイルが100個くらいある。 #getconf ARG_MAX 32000 ←引数3200個までは大丈夫 vmstat:実行待ちプロセス数、割り込み回数、消費メモリ、 カーネル/ユーザ/アイドルのCPU使用率、 コンテキストスイッチ数などを取得するコマンド。 11
  • 12. 【コマンド】 コマンド機能オプションなど意味 sed 文字列置換。-r 正規表現使用 s/条件/文字/g 条件を文字列に置換 find ファイル検索-type f:ファイル、d:ディレクトリ、l:シンボ リックリンク -name ファイル名のパターン -print0 区切り文字を0にする。 xargs ARG_MAX以 下になるように 分割してコマン ド実行 -0 区切り文字を0にする。 -PN 並列数N。0は最大限の並列化。 -t コマンドを標準エラー出力。 -I str strを標準入力の引数に置換。 12
  • 13. #!/bin/sh 0以上の連続するスペースを,に置換し、拡張子 csvで保存。 function func() { sed -r "s/[ ]+/,/g" "$1" > "$1.csv" } export -f func カレントディレクトリの*.logファイルのパスを引数 にしてfuncを呼び出す。 区切り0にしないとパスのスペースで区切られる。 find . -type f –maxdepth 1 -name "*.log" -print0 | xargs -0 -P0 -t -I %arg bash -c "func %arg" シングルクォーテーション’?シェル展開しない。 ダブルクォーテーション”?シェル展開する。 13
  • 14. 【コマンド】 コマンド機能オプションなど意味 du ディスク使用容 量。 -m メガバイト単位。 -k キロバイト単位。 -h M/K/Gを自動で選択する。 -s サブディレクトリを除く。 sort ソート-r 降順でソート。 -n 数値としてソート。 -u 重複排除。 14
  • 15. C:cygwinusr>du -sk ./* | sort -rn 409122 ./share 378867 ./ppc 343904 ./lib 166279 ./bin 63405 ./include 47820 ./src 28486 ./i686-pc-mingw32 2432 ./libexec 413 ./sbin 6 ./i686-pc-cygwin 3 ./ssl カレントディレクトリの各ディレクトリの使 用容量を降順でソート Windosのsortが優先される場合があ るので注意 パス検索の順序確認 >where sort C:cygwinbinsort.exe C:WindowsSystem32sort.exe 15
  • 16. 【コマンド】 コマンド機能オプションなど意味 awk 文字列処理用 (gawk) 言語。 -F 区切り文字 {cmd1} END{cmd2} cmd1:各行で実行 cmd2:最後に実行 構文:awk ‘program’ [file ...] gawk -F, ‘{print $2 $5}’ xx.csv ?csvの各行の2、5列目を表示。 gawk -F, ‘{printf “data10:%dn”, $10}’ xx.csv ?data10: dataという出力形式。 gawk -F, ‘BEGIN{print “START”} {printf “data10:%dn”, $10} END{print “END”}’ xx.csv ?最初にSTART/最後にENDと表示。 16
  • 17. gawk -F, ‘{print $5}’ x.csv | sort -nr | head -n 1 5列目の最大値を表示。 head –n N:先頭からN行を表示。 gawk -F, ‘{sum +=$5} END{print sum / NR}’ x.csv 5列目の平均を表示。 NR:行数 ※数値以外が含まれる場合の考慮はしていない。 17
  • 18. 【コマンド】 コマンド機能オプションなど意味 ps プロセス表示。aux a:全ユーザー、u:ユーザ名と開始 時刻、x:全プロセス grep 文字列の検索-v マッチしない行を表示。 -A num -B num A:マッチ行の前num行を表示。 B:マッチ行の後num行を表示。 -E 拡張正規表現(ERE)使用。egrepと 同様。 wc 行数などを表 示。 -c バイト数をカウント。 -w 単語数をカウント。 -l 行数をカウント。 なし行数、単語数、バイト数をカウント。 pgrep PIDを取得。-x 完全一致のプロセスのPIDを取得。 18
  • 19. #!/bin/sh threshold=3 count=$(ps aux | grep "$1" | grep -v "grep" | wc -l) if [ "$count" -ge "$threshold" ]; then echo "[WARNING]$count" fi psから引数のプロセスを抽出。 pgrep –x ”$1”でもよい。 psからgrepを除き、行 数を取得。 プロセス数が閾値以上ならばメッセージを表示。 watchコマンド、whileなどで定期実行しておく。 19
  • 20. 【コマンド】 ヒアドキュメント cmd<<xxでcmdにデータを渡すことができる。 cmd<<-xxとすると行頭のタブが無視される。 xxを’で囲むと変数、コマンドが展開されない。 例) mail –s ’タイトル’ <<EOF メール本文 EOF 20
  • 21. #!/bin/sh ftp –n “192.168.100.1” << EOF #ftp –n 標準入力からログイン情報を取得。 user ’hasegawa’ ’password’ binary #binaryモード cd ../ mget ”*.log” EOF ログインしてbinaryモードに切り替えて、 ログディレクトリに移動して*.logを取得 する。 21
  • 22. PowerShellについては近々紹介予定。 Windowsの設定を自動化できる。 C:WINDOWSsystem32WindowsPowerShellv 1.0 $adapters=Get-WmiObject -Class Win32_NetworkAdapterConfiguration - ComputerName. -Filter "IPEnabled='True'“ $adapters[0].EnableStatic(“192.168.200.100”,” 255.255.255.0”) 22
  • 23. $ip=@() $mask=@() $ip+=“1.1.1.1” $ip+=”2.2.2.2” $mask+=“255.0.0.0” $mask+=“255.0.0.0” 16個IPアドレスを設定するのもスクリ プトでやれば簡単 $adapters[0].EnableStatic($ip, $mask) 23