256bitの殺人メニュー

インフラエンジニアだったソリューションアーキテクトなくわののブログ。こちらのBlogは個人の意見となっていて会社とは全く関係ありません。お約束です。[twitter:@kuwa_tw]めんどくさがりが重い腰を上げて何かをアウトプットすることにどれほどの意味があるのかを試してみたいブログでもある。

シェルスクリプトで標準出力をファイルに出すようにする

おっさん力その1。
知らない人もいるのですなとおもって、メモ的に。

シェルスクリプトで標準出力をファイルに出す方法について
普通はあんまり使わないけど、監視サーバから叩かれるシェルのログを見たい時とかには使いますね。

テストコード

cat <<'EOF' >fdtest.sh
#!/bin/bash

# 標準出力(1)のFDを3に退避
exec 3>&1
# 標準出力をlogfileにリダイレクト
exec > logfile

echo "output file"

# 退避していたFDをもとに戻す
exec 1>&3

echo "output screen"
EOF

出力結果

kuwano@localhost:~/bin/test$ bash fdtest.sh
output screen
kuwano@localhost:~/bin/test$ cat logfile
output file

Classic Shell Scripting

Classic Shell Scripting

  • 作者: Arnold Robbins,Nelson H. F. Beebe
  • 出版社/メーカー: Oreilly & Associates Inc
  • 発売日: 2005/06
  • メディア: ペーパーバック
  • クリック: 3回
  • この商品を含むブログを見る

sedで/の置換をエスケープなしでやりたい

おっさん力その2。
sedでパス名の置換したい時に、/のエスケープすんのがめんどくさいって言ってた人がいたんで。

エスケープ

#!/bin/bash

for i in `ls /usr/local/`
do

echo ${i} | sed "s/\/usr\/local\///"

done

↓結果

bin
etc
games
include
lib
man
sbin
share
src

これでもいいんですけど、ごちゃってしてみづれーですよね。

エスケープしない

よく知られてないのかはわかりませんが、実は、s/の/部分の記号はなんでもいいのです。
ということで、このようにもかけます。

#!/bin/bash

for i in `ls /usr/local/`
do

echo ${i} | sed "s#/usr/local/##"

done

でも行けます。

まあ

このパターンならbasename使えって話ですけどね。

#!/bin/bash

for i in `ls /usr/local/`
do

basename ${i}

done


いじょー。
おれはおっさんじゃない!!!

sed & awk デスクトップリファレンス

sed & awk デスクトップリファレンス