Shellの小ネタ集

文字列の長さを得る

expr は引数にコロンがあると、その右側と左側の文字列を比較して、先頭から何文字までが等しいかという値を返却する。そのため、以下のようにすると文字列の長さが得られる。

expr "string" : '.*'

文字列中に特定の文字列が存在するかを調べる

if echo "$STRING" | grep "$SUBSTRING" > /dev/null
then
    echo "Found it"
fi 

文字列の余計なホワイトスペースの削除

echo コマンドはタブや連続したホワイトスペースを1つのホワイトスペースに変換し、先頭や末尾にあるホワイトスペースを取り除く。以下のようにすると、余計なホワイトスペースが除去できる。

STRING=`echo $STRING` 

文字列から一部を取り出す。

文字列の5番目から7番目を切り出す

# echo "abc:def:ghi" | cut -c5-7
def


区切り文字を:と指定し、2番目のフィールドに該当する部分を切り出す

# echo "abc:def:ghi" | cut -d':' -f2
def

ファイルサイズの調べ方

wc -c file | awk '{print $1}'

引数の値をそのままコマンドに渡す

command ${@+"$@"}

ファイルのゼロクリアいろいろ

いろいろなやり方あります

>file
: >file
cat /dev/null > file
cp /dev/null file 

改行コードのCRLF→LF変換

tr -d '\015' < infile > outfile

大文字小文字変換

大文字→小文字変換

$ cat in.txt | tr '[A-Z]' '[a-z]' > out.txt


小文字→大文字変換

$ cat in.txt | tr '[a-z]' '[A-Z]' > out.txt

IDの取得

ユーザIDの取得

UID=`id | sed -e 's/uid=//' -e 's/(.*//'`


ユーザ名の取得

USER=`id | sed 's/uid=.*(\(.*\)) gid=.*/\1/'`

OS名とシステム名を表示する

OSの名前を表示(unameコマンド)

$ uname
Linux


ホスト名

$ uname -n
web01.etc


全ての情報を表示

$ uname -a
Linux web01.etc 2.6.9-55.ELsmp #1 SMP Wed May 2 14:28:44 EDT 2007 i686 i686 i386 GNU/Linux

ファイルの一括置換

optディレクトリ下のhtmlファイル中にある/hogeを/hogehogeに一括置換

find /opt/ -name '*.html' -exec perl -npi -e 's@/hoge@/hogehoge@g' {} \;


バックアップファイルが必要な場合は

find /opt/ -name '*.html' -exec perl -npi.back -e 's@/hoge@/hogehoge@g' {} \;

SVNフォルダを再帰削除

.svnフォルダを消したい時とか、

find ./hoge -name ".svn" -print -exec rm -rf {} ";" 

ディレクトリコピー

directory1以下のディレクトリをdirectory2へコピー
cpコマンド

cd directory1
cp -r . directory2


cpioコマンド

cd directory1
find . -depth -print | cpio -pdum directory2


tarコマンド(directory2が既存の場合)

(cd SourceDir; tar -cf - .) | (cd DestDir; tar -xf -)


ネットワーク越し(rsh)

(cd LocalDir; tar -cf - .) | rsh host "cd RemoteDir; tar -xf -"  

tarしてgzip

hoge.tar.gz の内容を表示

gzip -dc hoge.tar.gz | tar tvf -


hoge.tar.gz を展開

gzip -dc hoge.tar.gz | tar xvf -


カレントディレクトリ以下を tar でアーカイブし、gzip で圧縮

tar cvf - . | gzip -c > hoge.tar.gz


hoge.hogeを tar でアーカイブし、gzip で圧縮

tar cvf - ./hoge.hoge | gzip -c > hoge.tar.gz 

sedで文字列の変換

sed -e "s/OldText/NewText/g"

gはgloballyの略で、全てを対象とする。gが無い場合はその行に出てくる最初の文字だけが対象となる。

sedで文字列の削除

sed -e "s/TextToRemove//g"

sedで行頭文字列の削除

sed -e "s/^TextToRemove//"

sedで行末文字列の削除

sed -e "s/TextToRemove\$//"

sedで文字列の追加

abcの後にxyzを追加する例

sed -e "s/abc/abcxyz/g"

sedでタブ/スペース変換

sed -e 's/<tab>/<space>/g'

sedで複数のスペースを1個のスペースに変換

sed -e 's/<space><space>*/<space>/g'

sedで行頭のホワイトスペースを削除

sed -e 's/^[<space><tab>]*//'

sedで行末のホワイトスペースを削除

sed -e 's/[<space><tab>]*$//'

sedでTextを含む行を削除

sed -e "/Text/d"

grep使うと

grep -v "Text"