unix linux tips

出典: 有限会社クラフト 技術情報

簡単なunix linuxのtipsを掲載してます。ミスなどあれば、ご連絡頂ければ幸いです。

目次

コントロールキー一覧

  • CTRL+Q
 入力ターミナルにCTRL+Sのコードが送られ、画面表示がストップ時、このキーで画面表示を再開可能
  • CTRL+J
 夕一ミナルモードをリセット
  • CTRL+D
 入力終了(EOF)
  • CTRL+C
 実行中のプログラムを中断
  • CTRL+Z
 実行中のプログラムの停止を試行
  • CTRL+\
 実行中のプログラムを強制的終了

複数のディレクトリを一度に作成する

 mkdir /aa/{help,work,att}

結果

   /aa/help
   /aa/work
   /aa/att

が作られる

指定したユーザーでコマンドを実行

bsd

 su -l <username> -c <command>

linux

 su -c '/usr/local/pgsql/bin/pg_ctl start' - postgres
           コマンド                         ユーザー名

フロッピー(FD)のイメージダンプとリストア

イメージ取得

   dd if=/dev/fd0 of=foo.img

イメージ書き込み

   dd if=foo.img of=/dev/fd0

MBR保存(HDでも可能、ifを変更すること)

   dd if=/dev/fd0 of=/dev/fd0 bs=512 count=1

ddについて

判例

 dd if=/dev/rdsk/???? of=/dev/rmt/0mn bs=1024k count=620 skip=621
 if=読み込み元
 of=書き込み先  /dev/rmt/0:最初のテープデバイス m:ミディアム圧縮 n:巻き戻しなし
 bs=ブロックサイズ(必ず512byteの倍数であること)ここでは1024K=1Mごととしている
 count=回数 (620*1024k=640MByte)
 skip=スキップする範囲

CD-ROMサイズにわけて保存する

 dd if=/dev/rdsk/c2d0s9 of=/dev/rmt/0mn bs=1M count=620
 dd if=/dev/rdsk/c2d0s9 of=/dev/rmt/0mn bs=1M count=620 skip=621
 dd if=/dev/rdsk/c2d0s9 of=/dev/rmt/0mn bs=1M count=620 skip=1241

ネットワーク経由でddを使う

手法はいくつかあるが、安易なのは、ncコマンドを使用した方法である。

  • 受信元マシンで待ちうけ設定
   nc -l -p 8080 > cimage.dd
       nc -l -p 待ちうけポート > ファイル名
  • 送信先マシンから送信開始
   dd if=/dev/rdsk/???? bs=1024k count=620 skip=621 | nc 192.168.0.1 8080
                                                       送信先IP 送信先ポート

フォルダの使用容量ランキング

homeの各フォルダの使用容量を調べる

 du -s /home/* | sort -nr

改行コードを取る

  • 1ファイルでの例

!!入力と出力は同じファイルにしないこと!!!!

 tr -d '\r' < in > out
  • 複数ファイルを同時
 for i in *.{cgi,pl}
 do
   tr -d '\r' < $i > $i.tmp
   mv $i.tmp $i
 done

nkfで文字コードと改行コード変換

unix[eucコード(LF改行)]変換

!!入力と出力は同じファイルにしないこと!!!!

  nkf -e -Lu file > output_file
  -e euc出力
  -L 改行モード
      -Lu   unix (LF)      0x0a
      -Lw   windows (CRLF) 0x0d0a
      -Lm   mac (CR)       0x0d

windows[sjisコード(CRLF改行)]変換

!!入力と出力は同じファイルにしないこと!!!!

  nkf -s -Lw file > output_file
  -s sjis出力
  -L 改行モード
        -Lu   unix (LF)      0x0a
        -Lw   windows (CRLF) 0x0d0a
        -Lm   mac (CR)       0x0d

disk test

dosテキストファイルの ^Mを取る

 tr -d '\015' < beforefile > afterfile

16進ダンプ(hexdump)表示

16進ヘキサーと文字コード表示

 od -hc file

16進ヘキサー表示

 od -h file

以下のコマンドがインストール済みの場合もある hd hexdump

ファイル名の一括変換

  • 例1
 for i in *.jpg
 do
   mv $i `echo $i | sed 's/z0/a/'`
 done

実行すると …

 ファイル名 z01.JPG -> a01.JPGへ
 ファイル名 z02.JPG -> a02.JPGへ
 ファイル名 z03.JPG -> a03.JPGへ
 ファイル名 z04.JPG -> a04.JPGへ

に変更される

  • 例2 複数の拡張子を対象に処理をする(jpg,png,gifが選択される)
 for i in *.{jpg,png,gif}
 do
   mv $i `echo $i | sed 's/P00/a/'`
 done

ファイルを読み込んで拡張値を変えて処理結果を保存

 #!/bin/sh

 LOGDIR=../snifer-log-pc\(020730\)

 # UP SDK
 for i in `find ${LOGDIR} -type f -name "*_up_sdk_*.cap"`
 do
   echo make $i figure
   fig_name=`echo $i | sed 's/.cap$/.fig/'`
   tethereal -R "ip.addr == 192.168.59.7" -V -r $i | gawk -f count.awk -v mode="figure"  > ${fig_name}
 done

ディレクトリ名からファイル名取出し

  • 末尾に/が付かなければファイル名を取り出せる(先頭の/は影響なし)
  echo "/aaa/bbb/ccc" | awk 'BEGIN {FS="/"} { print $NF}'

結果、ccc が出力される $は指定したフィールドを表示する NFはフィールド数なので、最後のフィールド内容を表示する

  • 具体例
 #!/bin/bash

 rowLogDir=take_raw_log/
 traficDir=trafic/

 ## trafic normal chenge
 echo "trafic normal chenge"

 mkdir ${traficDir}

 #
 for i in `find ${rowLogDir} -type f -name "*.csv"`
 do
   echo make $i
   trafic_name=`echo $i | awk 'BEGIN {FS="/"} { print $NF}'`
   trafic_name=`echo ${traficDir}${trafic_name}`

   awk -f trafic_normal_chenge.awk $i > ${trafic_name}
 done

ディレクトリ名からファイル名だけ除外

 echo "/aaa/bbb/ccc.txt" | awk 'BEGIN {FS="/"} { for(i=1;i<NF;i++){printf("%s/",$i);} }'

ディレクトリは残してファイルだけ消す

 find /home/aaa -type f -exec rm {} \;

ディレクトリ配下のhtml/htmだけをディレクトリ構造ごとコピー

#!/bin/sh

srcDir="corp"
dstDir="corp_onlyhtml"

#
for i in `find ${srcDir} -iname "*.html" -o -iname "*.htm" `
do
  echo $i

  dir=$dstDir/`echo $i | awk 'BEGIN {FS="/"} { for(i=1;i<NF;i++){printf("%s/",$i);} }'`
  file=`echo $i | awk 'BEGIN {FS="/"} { print $NF }'`

  mkdir -p $dir
  cp $i $dir/$file

done


ファイルの文字列置換

for i in *.eps
do
  sed -e 's/MSPゴシック/GothicBBB-Medium-H/g' $i > tmp

  mv tmp $i
  rm tmp
done

行頭に特定の文字の後があれば、他のファイルの内容を追加

#!/bin/sh

DIR=.
TMP=tmp

# html file
for old in `find ${DIR} -type f -name "*.htm*" `
do
  echo ${old}
  cp ${old} ${TMP} 

  cat ${TMP} | awk '

    BEGIN {
      FS=" ";
      IGNORECASE=1;
    }

    {
      print $0;
    }

    /^<body/ {
      system("cat s1");
    }

    ' > ${old}

done

無限ループ

 while [ 1 ];
 do
   tail -f /tmp/az
   sleep 1
 done

該当日時までループ

2004/07/18 05:00まで動作する

 LIMIT=2004071805
 while [ `date '+%Y%m%d%H'` -lt $LIMIT ] ;
 do
   logname=`date '+%Y_%m%d_%H%M%S_aaaaaa.csv'`
   echo $logname
   sleep 5
 done
adsense
位置情報とアクセス解析
なかのひと