#author("2018-09-15T06:21:41+00:00","default:sysosa","sysosa")
#author("2018-09-16T16:27:55+00:00","default:sysosa","sysosa")
結構簡単なbashスクリプトを作っているが、細かい点を忘れがちでここに記す
&size(10){もはやbashに関係ないものも書いているが..};

***ファイルの存在が確認できたら実行する [#uac9ae7a]
前段での処理が完了して、その出力ファイルの存在を確認したら次のステップへ進ませる
#code(nonumber){{
until [ -r Micrographs/$seqfile ] ; do sleep 1; done
}}



***findで見つけたファイルをtarで固める [#qbe4e528]
#code(nonumber){{
tar . -name \( '*.html' -o -name '*.htm' \) -print0 |  tar czf find.tar.gz --null -T -
}}



***繰り返して実行する [#ff29081c]
#code(nonumber){{
while true ;do echo `date '+%y%m%d %H%M%S'` $(sensors | head -n +3 | tail -n 1 ); sleep 10; done;

while true; do echo `date '+%y%m%d %H:%M:%S'`  $(smartctl -d scsi -a /dev/nvme0n1 -T permissive | grep "Current Drive"|awk '{print $4}'); sleep 10 ;done;
}}

***pidに関係するファイルをみる [#u6ab1dc0]
#code(nonumber){{
lsof -p <pid>

watch -n 2 lsof -p <pid>     <-- 2秒ごとにlsofの内容を表示する
}}



***○行目以降を表示 [#qe043658]
qstatの表示で上二行を省いて表示
#code(nonumber){{
qstat | tail -n +3
}}


***ヒアドキュメント [#z3050ec6]
#code(nonumber){{
cat << _EOF_  > README.1st
どうして
こうなった?
_EOF_
}}
変数に収めるなら
#code(nonumber){{
l=$(cat <<_EOF_
どうしても
こうなる
_EOF_ 
)             #改行して「)」を入れる
}}


***awk [#j1584250]
awkをbashで使ったので
unixユーザで、uidが1000以上のユーザリストを取得する
#code(nonumber){{
[foo@c ~]$ getent passwd |awk -F: '$3>1000{print $1}'
}}
「-F」はデミリタ、「$3」でUIDの部分を示してそれが1000より大きいのを持って来て、「{print $1}」でアカウント名を表示


***標準出力 [#y14c8556]
標準出力、標準エラー共に一つのファイルに入れる. 「&color(magenta){2>1&};」を使う
#code(nonumber){{
[foo@c ~]$ ./bash.cmd  > log  2>&1
}}
&size(10){他にも「./bash.cmd  &color(crimson){>&};  log」、「./bash.cmd  &color(crimson){&>};  log」};

共に出力しないなら「&color(magenta){2>1&};」と「&color(mediumvioletred){/dev/null};」を使って
#code(nonumber){{
[foo@c ~]$ ./bash.cmd  > /dev/null 2>&1
}}

どちらとも別々のファイルに入れたい. log1(標準出力)、log2(標準エラー)
#code(nonumber){{
[foo@c ~]$ ./bash.cmd  1> log1  2> log2
}}

標準エラーは画面に出しつつファイルにも書いて欲しい。標準出力はいらね.
&color(magenta){tee};コマンドは標準出力をファイルに落としてくれるが、標準エラーは見ない。
なので一旦エラーの識別子(2)を(1)に変更して、パイプ(|)で渡す
#code(nonumber){{
[foo@c ~]$ { ./bash.cmd   3>&2  2>&1  1>&3 | tee log1; }  2> /dev/null
}}
&color(white,blue){留意}; 先頭の「&color(red){''{''};」の後は空白が必要
「3>&2  2>&1  1>&3」の考え方だけど、1と2を入れ替えただけ。イメージは下記のような感じ
&ref(2017y08m23d_190145715.png,nolink); 最終的に1と2が入れ替わった

***for文 [#i4cebc24]
よく使います. フォルダ内のファイルを処理したい場合
#code(nonumber){{
#!/bin/bash
IFS=$'\n'               # IFS="$'\n'$'\t' " デフォルト値だと改行、タブ、スペースが区切りと見做される
for f in `ls /tmp`; do
  echo $f
done
}}
そのフォルダが複数ある場合
#code(nonumber){{
#!/bin/bash
etc=`ls -d /etc/*`       #/etc直下のファイルをフルパスで表記
tmp=`ls -d /tmp/*`       #同/tmp直下も
for f in $etc $tmp; do   # 2つの変数を同時に扱う
  echo $f
done
}}
特定のファイルで
#code(nonumber){{
#!/bin/bash
mrcs=$(find /data4 -type f -name "*.mrcs" | grep -e "[0-9]\{4\}_[0-9]\{2\}") # "2012_06"とかを含むmrcsファイル
for f in $mrcs; do
  echo $f
done
}}
連番のファイルにしたい
#code(nonumber){{
#!/bin/bash
mrcs=$(find /data4 -type f -name "*.mrcs")
i=1
for f in $mrcs; do
  cmd="ln -s $f $(printf "%04d" $i).mrcs"   #一旦コマンドラインに整形して、次の行で実行
  $cmd
  i=$(expr $i + 1)
done
}}
既に連番を持ったファイルで偶数番号のファイルだけを拾いたい
#code(nonumber){{
#!/bin/bash
tif=$(find . -name "*.tif")
i=1
for f in $tif; do  #aaaa
   num=$(echo $f | cut -c6-9|bc)   # ファイル名の連番部分を切り出して(cut)、数字にします(bc)
   if [ $(($num%2)) == 0 ]; then   # 2で割った余りで偶数/奇数を見る
     echo $f
   fi
done
}}
***超簡易並列 [#k1c6d70e]
多数のディレクトリに対して処理を施したいが、どうせなら複数のジョブを流して対処したい
っで作ってみた
#code(nonumber,nooutline,nolink){{
#!/bin/bash

cat <<'_EOF_'>run.$$.sh            # 個々のディレクトリで動くスクリプト
#!/bin/bash
echo start:`date '+%y%m%d %H:%M:%S'`
expr `cat max |bc` - 1 > max

<目的の処理>

expr `cat max |bc` + 1 > max
echo end:`date '+%y%m%d %H:%M:%S'`
_EOF_
chmod +x run.$$.sh

echo 8 > max.                  # 同時実行数

for d in `find . -maxdepth 2  -mindepth 2 -type d`; do   # ターゲットのディレクトリを取得
  ./run.$$.sh $d &             # 「&」でバックグラウンド処理へ回す
  sync                         # 「max」ファイルの同期に必須
  if [ $(expr `cat max`) -eq 0 ]; then
     while :
     do
       sleep 10
       echo "break:" `cat max`
       if [ $(expr `cat max`) -gt 0 ]; then
         break
       fi
     done
  fi
done
rm -f run.$$.sh max
}}

***文字列操作 [#me528a5d]

#code(nonumber){{
pid=12345.chaperone.jp

echo ${pid%%.*} ---> 12345

echo ${pid%.*}  ---> 12345.chaperone

echo ${pid#*.}  ---> chaperone.jp

echo ${pid##*.} ---> jp

#-------------------------------#

dir="/var/lib/pbs"

echo ${dir##*/} ---> pbs                  *注意 dir="/var/lib/pbs/"なら ""(なし)になる

echo ${dir#*/}  ---> var/torque/pbs

echo ${dir%/*}  ---> /var/torque          *注意 dir="/var/lib/pbs/"なら "/var/torque/pbs"となる

echo ${dir%%/*} ---> "" (なし)

#-------------------------------#
tif="Micrographs/s1_100001_movie.tif"

echo ${tif/_movie.tif}.mrc --> Micrographs/s1_100001.mrc

}}

トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS