主にUbuntu14.04でのbash上でスクリプトを動かした時のメモです。基本的なものは、CentOSなどでも有効ですが、オプションが微妙に異なる事があります。
Linux関係でのシェルスクリプトメモ
基本
実行結果を変数に格納「$()」とバッククオート
$(コマンド) や バッククォートでコマンドを囲むと次の様に変数に代入して使ったり出来ます。バッククオートの方がシンプルで簡潔な感じがしますが、初心者がシングルクォートと間違えたりする事あるかもしれません。また、$()は、ネストして使うことも出来ます。
KEKKA=$(ls -1tr | tail -n 1)
最も新しいタイムスタンプのファイル名がKEKKAに代入されます。
DATESTR=$(date +%Y_%m_%d)
今日が2022年2月3日なら、DATESTRが「2022_02_03」となります。
TSVファイル加工
1行目をカット、3列目のみ使う、項目の右端に半角カンマ付加、改行削除
sed 1d samplefile.tsv | cut -f3 | awk '{print $1","}' | tr -d "\n"
緯度、経度、値のようなデータから、緯度のみを取り出して1行にする。以下の様な内容になる。
35.53527961,35.54406335,35.55200615,35.55790072,35.56482473,35.57177418,35.57874627,35.58573235,35.59272382,35.60126796,35.60586475,35.61326295,35.62195623,35.62986071,35.63862818,35.64609106,35.65062147,35.65303037,35.65693338,35.66330111,35.67129473,35.67936753,35.68744228,35.69550919,35.70357795,35.71164548,35.71971557,35.72778169,35.73585154,35.74392086,35.75180884,35.75663327,35.75968077,35.76458262,35.77259184,35.77421234,35.7827242,35.79127109,35.79994844,35.80675105,35.8153858,35.82371878,35.83136962,35.83802896,35.84503731,
----以下省略-----
TSVファイルに日付情報をファイル名から追加してコード毎にまとめる
- 2017-01-30
- CentOS release 6.3
- ファイルは「2017-01-30-14.txt」の形式で最後の「-14」が時間。これを後ほどグラフ作成で使いたいので"2017-01-30-14"を"2017-01-30 14:00:00"の形式にしたい。
#!/bin/bash
cd hogehoge
WORKFNAME1=view2_1.temp
WORKFNAME2=view2_2.temp
for F in near_????-??-??-??.txt; do
awk -vOFS="\\t" -v fname="$F" -F"\\t" '{print $1, fname , $4 }' $F
done \
| sort -k1n > $WORKFNAME1
sed -e "s/\-\([0-9]\{2\}\)\.txt/ \1:00:00/" -e "s/near_//" $WORKFNAME1 > $WORKFNAME2
for NO in `cut -f1 $WORKFNAME2 | uniq`; do grep ^${NO}[[:space:]] $WORKFNAME2 > point_${NO}.tsv; done
rm $WORKFNAME1
rm $WORKFNAME2
同様の処理を複数のフォルダに行う場合に関数化
#!/bin/bash
datahenkan_tsv() {
# dirctory
cd $1
WORKFNAME1=view2_1.temp
WORKFNAME2=view2_2.temp
for F in near_????-??-??-??.txt; do
awk -vOFS="\\t" -v fname="$F" -F"\\t" '{print $1, fname , $4 }' $F
done \
| sort -k1n > $WORKFNAME1
sed -e "s/\-\([0-9]\{2\}\)\.txt/ \1:00:00/" -e "s/near_//" $WORKFNAME1 > $WORKFNAME2
for NO in `cut -f1 $WORKFNAME2 | uniq`; do grep ^${NO}[[:space:]] $WORKFNAME2 > point_${NO}.tsv; done
rm $WORKFNAME1
rm $WORKFNAME2
}
# ----- ^^^^^ -----
datahenkan_tsv dirsampe1
datahenkan_tsv dirsampe2
datahenkan_tsv dirsampe3
datahenkan_tsv dirsampe4
datahenkan_tsv dirsampe5
サーバー管理
ディスク空きが少なくなったらメールする
dfコマンドを利用してデバイスひとつの空きが少なくなったことを利用率(%)で大凡判断して指定した%を越えていたらメールを送る。(2022-02-03)
#!/bin/bash
TO_MAIL=hogehoge@iscb.net
SERVER_ID=server1234-01
CHKDEVICE=/vda3
CHKPER=95
USEPER=$(df | grep "$CHKDEVICE" | tr -s " " | cut -d" " -f 5 | tr -d "%")
#echo check device:$CHKDEVICE / test $USEPER -gt $CHKPER
# true:0 / false:1
#test $USEPER -gt $CHKPER
#echo $?
if test $USEPER -gt $CHKPER; then
df -h | mail -s "$SERVER_ID: disk space small / now $USEPER % use" $TO_MAILt
fi
ディスク使用増加をduでチェック
- 2022-02-12
- ディスクの使用増加を幾つかのフォルダに注目する為に、duコマンドで定期的にチェックし、チェックした日時を追加してTSV形式で保存。
#!/bin/bash
# 2022-02-12
DT=$(date +"%Y-%m-%d %H:%M");(du -d1 /;du -d1 /home; du -d1 /home/kansoku) | sed "s/^/${DT}\t/g" \
>> disk_use_log_$(date +"%Y-%m").tsv
- ポイント
- $(コマンド) で実行結果を変数に代入
- sedでの行先頭の検索は「^」
- sed置き換え文字のタブ記号は「\t」
ファイル転送関係
expect
- 2022-02-15
- 対話形式の処理をスクリプト内で行う→パスワード入力が必要な処理を自動化出来る。
- 例えば、sftpでの処理を自動化する例
- 以下のような内容でsftp_expect.sh を作成して実行すると、「アカウト名@IPアドレス」と「アカウト名のパスワード」で接続したサーバのファイルをダウンロード。
#!/usr/bin/expect
spawn sftp アカウト名@IPアドレス
expect "password:"
send "アカウト名のパスワード\n"
expect "sftp> "
send "cd point/2022/02\n"
expect "sftp> "
send "get M*\n"
expect "sftp> "
send "quit\n"
interact