コマンドラインについてのメモ

apt-get bash basename cat chattr chgrp chown cp du
echo e2fsck find grep hdparm head ls man mkdir
nl nkf patch ps sort sync tail tar tee
touch tr tune2fs uniq w3m wc which




bash
bash のスクリプトをデバッグするには

  #!/bin/bash

#!/bin/bash -x

に変更して実行する(shでも同様)。
または、コマンドラインで、

$ /bin/bash -x foo.sh
と、する。


bash の一部をデバッグするのは、
  #!/bin/sh

デバッグが必要ない部分

set -x <- 実行状況の出力を開始

デバッグが必要な部分

set +x <- 実行状況の出力を終了

デバッグが必要ない部分
と、する。


apt-get

操作は全てルートでやる。

  # apt-get update データ−ベース更新
  # apt-get upgrade パッケージのアップグレード
  # apt-get install package
    package のインストール、アップグレード

落して来たファイルを問答無用でインストールされちゃうのは、なんだかな〜 な感じがする。
やっぱり、自分で落して、自分の手で入れたいな。
そんなオレは古い人間?

でも、セキュリティ−に問題をはらんだパッケージを何も考えないでアップデート出来るのは、 ちょっと楽かな。

ls
  $ ls file[123] file1 file2 file3 にマッチ
  $ ls file[1-3] file1 file2 file3 にマッチ
  $ ls file[^123] file1 file2 file3 以外にマッチ
  $ ls -h file ファイルのサイズを Kilo, or Mega で表示
  $ ls -tr 日付順にソートして表示
-l 又は -a を付けてロングファイルネームにしないと意味なさげ

cat
conCATenate
$ cat -n file 行番号を付加 空白行もカウント
$ cat -b file 行番号を付加 空白行を数えない

$ cat -ev file 改行コードを表示
(ホントの意味は別と思われる)
  ^Mは CR(carrige return)
$は LF(line feed)
Unix は LF のみ
直し方は nkf を参照

head
指定ファイルの最初の部分を表示する
  $ head hoge.txt hoge.txt の最初の10行を表示
  $ head -n 20 hoge.txt hoge.txt の最初の20行を表示
  $ head -c 100 hoge.txt hoge.txt の最初の100バイトを表示

tail
指定ファイルの末尾の部分を表示する
  $ tail hoge.txt hoge.txt の最後の10行を表示
  $ tail -n 20 hoge.txt hoge.txt の最後の20行を表示
  $ tail -c 100 hoge.txt hoge.txt の最後の100バイトを表示
  $ tail -f hoge.txt の末尾 10 行を表示し、その後ファイルに追加される行を待ち続ける

wc
ファイルの行数、単語数、文字数をカウント
  $ wc 左から順に、行数、文字数、バイト数、を表示
  $ wc -c file 文字数のみを表示
  $ wc -l file 行数のみを表示
  $ wc -w file 単語数のみを表示

tr
文字列の変換/削除
  $ tr UNIX unix file file 中の UNIX を unix に変換
  $ tr '[A-Z]' '[a-z]' file file 中の大文字を小文字へ変換
  $ tr -d 'a-z' file file 中の小文字を全て削除

cp
  $ cp -i 上書するときは問い合わせする
  $ cp -f 強制上書き
  $ cp -R 再帰
  $ cp -p ファイルの属性を保存(オーナー、パーミッション、日付、等)
  $ cp -d シンボリックリンクをコピー
  $ cp -v verbose
  $ cp -dpR hoge hoge.org よくやる手 ディレクトリを丸ごとコピー

mkdir
$ mkdir -p /hoge/fuga/foo       子ディレクトリも一緒に作成

man
$ man -k file    file に関係したマニュアル項目を探す

grep
  $ grep '^[0-9].*/.txt$' text 先頭の文字が数字で文末が .txt で終るパターンを表示
    -l マッチしたファイルのファイル名のみ表示
    -c パターンにマッチした行の数を表示
    -i ignore case 大文字小文字を区別しない
    -n 行番号を付加
    -v パターンにマッチしない行を表示

tee
標準入力を標準出力とファイルに出力
  $ make | tee log | less   fileの表示を標準出力と log へ出力
  $ make | tee -a log | less   上書きせずに追加保存

sort
テキストファイルを行単位で文字コードの順にソート
  $ sort -n file 先頭の文字列を数字として比較
  $ sort -k 3 file 0から数えて3番目のフィールドを比較
  $ sort -k 3,5 file 3番目から5番目までのフィールドを比較
  $ sort -u file ソートした結果の内の重複した分を1行にする
  $ sort -b file 行頭の空白を無視
  $ sort -f file 大文字小文字を区別しない
  $ sort -r file 逆順にソート
  $ sort -t : file フィールドの区切り文字を : にしてソート

uniq
ファイルの重複行を削除する
但し、隣接する2つの行でしか比較は行わないので sort との併用が多い
  $ sort file.txt | uniq 重複行を1行にして表示
  $ sort file | uniq -u 重複していない行を表示
  $ sort file | uniq -d 重複行のみを表示
  $ sort file | uniq -c 重複行が何回現れたかを表示

basename
ファイル名からディレクトリと拡張子を取り去る
(例) #!/bin/sh
# カレントディレクトリの *.htm を *.html に変換
#
for i in *.htm ; do
  j=`basename $i .htm`.html
  echo mv $i  $j
done

$ ls *.htm*
  > 1.htm   2.htm
$ ./base-test
$ ls *.htm*
  > 1.html  2.html

w3m
w3m で html ファイルをテキストファイルに変換。
$ w3m -dump hoge.html > hoge.txt
これだけで罫線とか表とかもテキスト型式に変換してくれる、すぐれもの。

sync
ディスク上のデーターとキャッシュ/バッファの同期をとる
一般的には、キャッシュやバッファの内容をディスクに戻すが、Linux では
スケジューリングされるだけなので、実行されるまでにしばらく時間がかかる。

touch
ファイルのアクセス時刻/修正時刻を設定する
  -a アクセス時刻だけを現在時刻に設定
  -m 修正時刻だけを現在時刻に設定
  -r file 現在時刻の変わりに file のアクセス時刻/修正時刻に設定
  -t yyyymmddhhmm.ss 指定した時刻に設定
yyyy: 年。2桁または4桁(1969 〜 2068)
mm:   月
dd:   日
hh:   時
mm:   分
ss:   秒(省略可)

chattr
ファイルの属性を変更
$ chattr モード(オペレータ、属性) ファイル名
オペレータ
  + 属性の設定
  − 属性の解除
  = 指定した属性のみ設定
属性
  A   アクセス時刻を更新しない
  a   追加書き込みのみ許可
  c   自動的に圧縮する
  d   dump 起動時にバックアップされない
  i   変更不可
  s   安全な削除
  S   同期更新
  u   復活可能
chown
ファイル/ディレクトリの所有者とグル−プを変更
$ chown  ユ−ザ−名/グル−プ名  ファイル...

chgrp
ファイル/ディレクトリのグル−プを変更
$ chgrp  グル−プ名  ファイル名...

du
ディスクの使用量を表示
  -k 1Kバイト(1024バイト)単位で表示
  -m 1Mバイト(1048576バイト)単位で表示
  -h 読みやすい単位で表示(1024倍)
  -H 読みやすい単位で表示(1000倍)
  -s 合計の使用量を表示
  -c 複数項目の合計を表示
  -x 別パ−ティションにあるディレクトリは除外する

which
  コマンドのフルパスを表示
  通常は、コマンド検索パス($PATH)の中から優先順位が高いものから
  1つだけを表示するが、-a オプションをつけると
  マッチしたもの全てを表示。

echo
グチャグチャになった端末を元に戻す。
   $ echo ^[ ESC c
   -> echo(space), ctrl+v, ESC c, return
   


e2fsck
ext3 journal file system に fsck をかける。

File System の状態確認
# tune2fs -l /dev/hdb2
> Mount count: 31
> Maximum mount count: 27

これって、オカシイでしょ?

# umount /dev/hdb2
fsck を掛ける前に、un-mount しないと
cause SEVERE(確実に) filesystem damage.
なんだって。

# e2fsck -c -j /mnt/80g/ /dev/hdb2
> e2fsck 1.27 (8-Mar-2002)
> Checking for bad blocks (read-only test): done
> Pass 1: Checking inodes, blocks, and sizes
> Pass 2: Checking directory structure
> Pass 3: Checking directory connectivity
> Pass 4: Checking reference counts
> Pass 5: Checking group summary information
>
> /dev/hdb2: ***** FILE SYSTEM WAS MODIFIED *****
> /dev/hdb2: 30781/3662848 files (3.5% non-contiguous), 4680763/7323631 blocks

うーーん、コンナンで、ホントに大丈夫なんだろうか。
ナンか、不安。

File System の状態再確認
# tune2fs -l /dev/hdb2
> Mount count: 0
> Maximum mount count: 27

再起動したら、ちゃんと動いたから、平気なんだろう。

ある日突然起動しなくなって(正確にはディスクの確認のトコで止まる)、ビビったのさ。


nl
行番号を付けて、テキストファイルを表示
   $ nl text.file :


find
$ find . -name hoge.txt -print
カレントディレクトリを起点に hoge.txt を探して、表示する。

$ find . -name hoge.txt
これは、ただ表示してくれるだけで、上とおんなじ。

$ find . -name hoge.txt -type f
検索対象をファイルのみに指定。 バイナリファイルを検索対象から外す。
    -b ブロックスペシャルファイル
    -c キャラクタスペシャルファイル
    -d ディレクトリ
    -p 名前付きパイプ
    -f 通常のファイル
    -l シンボリックリンク
    -s ソケット

$ find . -name   hoge.txt   -exec ls -1 {} \;
表示を ls -1 にしてくれる。

$ find . -name hoge.txt -exec ls -lh {} \;
なんてすると、もっと違いが出てきまふ。

$ find . -type f -mtime -1
カレントディレクトリを起点にして、 24時間以内に 作成、修正された 通常ファイルを探す。

-mtime +5 5日前より以前
-mtime   5 5日前( 5 x 24hr ~ 6 x 24hr )
-mtime -5 5日前以降

$ find . -size +1m -type f
カレントディレクトリを起点にして、ファイルサイズが1M以上の 通常ファイルを探す。

$ find . -name "*.jpg" -type f -size +500k -mtime -2
拡張子が jpgで、ファイルサイズが 500k以上で、2日間に更新された 通常ファイル。





patch
パッチファイルの当て方。

hoge.tar.gz と、パッチファイル hoge.patch があったとすると
$ tar xzvf hoge.tar.gz
Created directory ~/hoge/
$ cd hoge
$ mv ../hoge.patch .
$ patch -p0 < hoge.patch
  or
$ zcat hoge.patch.gz | patch -p0
( パッチファイルが gzip の時 )

-p0 とは、パッチを当てるときにディレクトリを何階層無視するかの指定。

例えば、パッチファイルを作る人が
$ ~/hoge/hage/
ってなディレクトリのときに
~/hoge/hage/ の中でパッチファイルを作っていた時は
カレントで行われているので無視するディレクトリは無く、-p0 となる。

~/hoge/ にいるときに
$ patch -Naur ./hage.org ./hage/
ってな感じでパッチを作っていると
パッチを当てる時はディレクトリ1つ分を無視する事になり -p1 になる。

tar
$ tar xzvf file.tar.gz file.tar.gz をカレントに展開
$ tar czvf tmp.tar.gz ./tmp/ ./tmp/ を tmp.tar.gz に圧縮
$ tar xIvf file.tar.bz2 file.tar.bz2 をカレントに展開

ps
RSS(使用メモリ量)の多い順にソートして表示。
$ ps -aux -->
top では CPU を多く使用しているプロセスしか表示できないから。


tune2fs
2nd 拡張ファイルシステム (ext2fs) のパラメータを調整する

# tune2fs -l /dev/hda2
ファ イ ルシステムのスーパーブロックの内容を表示する。

> tune2fs 1.27 (8-Mar-2002)
> Filesystem volume name: <none>
> Last mounted on: <not available>
> Filesystem UUID: eb5c4b6c-f638-11d4-8758-b5c238b89561
> Filesystem magic number: 0xEF53
> Filesystem revision #: 1 (dynamic)
> Filesystem features: filetype sparse_super
> Filesystem state: clean
> Errors behavior: Continue
> Filesystem OS type: Linux
> Inode count: 6024
> Block count: 24097
> Reserved block count: 1204
> Free blocks: 19886
> Free inodes: 5998
> First block: 1
> Block size: 1024
> Fragment size: 1024
> Blocks per group: 8192
> Fragments per group: 8192
> Inodes per group: 2008
> Inode blocks per group: 251
> Last mount time: Sun Oct 28 17:57:17 2001
> Last write time: Thu Jun 13 22:05:14 2002
> Mount count: 13
> Maximum mount count: 20
> Last checked: Tue Jul 31 19:05:09 2001
> Check interval: 15552000 (6 months)
> Next check after: Sun Jan 27 19:05:09 2002
> Reserved blocks uid: 0 (user root)
> Reserved blocks gid: 0 (group root)
> First inode: 11
> Inode size: 128


-c max-mount-counts
ファ イルシステムをチェックする最大マウント回数を設定する。
max-mount-counts が 0 の場 合、 e2fsck(8)と カーネルは
ファイルシステムのマウント回数を考慮しない。

# tune2fs -c 30 /dev/hda2
最大マウント回数を20から30へ変更。
> tune2fs 1.27 (8-Mar-2002)
> Setting maximal mount count to 30

他に、-i オプションもある。
-i interval-between-checks[d|m|w]
ファイルシステムをチェックする最大の時間間隔を設定する。
数値のみ、もしくは末尾に d を付けると「日」と解釈され、
m, w はそれぞれ「月」「週」と解釈される。
0 を指定すると、時間依存のチェックはしなくなる。

nkf

改行コードをUnix向け(LF)に変換
$ nkf -Lu -e DOS-file > unix-file

-Lu は CR-LF の改行コードを LF に変換
-e は 出力を euc code にする


$ perl -pe 's/\r\n/\n/' DOS-file > unix-file
でも同じだそうだ。

$ nkf -w -Lu euc-file.txt > utf-file.txt
EUC のファイルを UTF-8 へ変換。


hdparm

# hdparm [option] [/dev/hda]

ハードディスクアクセス時のパラメーターを収得/設定できるコマンド
ディスクをマウントしたままで実行できる(当たり前?)。

DMA On  : # hdparm -d1 /dev/hda
DMA Off : # hdparm -d0 /dev/hda

16bit I/O mode : # hdparm -c0 /dev/hda
32bit I/O mode : # hdparm -c1 /dev/hda

現在の設定確認: # hdparm -v /dev/hda
転送スピードのチェック: # hdparm -ft /dev/hda
  -f: は、キャッシュのフラッシュ


2002.10.15 現在の athene:

# hdparm -v /dev/hda
 > /dev/hda:
 > multcount    = 16 (on)
 > I/O support  =  0 (default 16-bit)
 > unmaskirq    =  0 (off)
 > using_dma    =  0 (off)
 > keepsettings =  0 (off)
 > nowerr       =  0 (off)
 > readonly     =  0 (off)
 > readahead    =  8 (on)
 > geometry     = 10011/255/63, sectors = 160836480, start = 0

転送スピードチェック
DMAオフ、16ビットモード( -d0 -c0 )
  > Timing buffered disk reads: 64 MB in 20.71 seconds = 3.09 MB/sec

DMAオン、16ビットモード( -d1 -c0 )
  > Timing buffered disk reads: 64 MB in 1.40 seconds = 45.71 MB/sec

DMAオン、32ビットモード( -d1 -c1 )
  > Timing buffered disk reads: 64 MB in 1.41 seconds = 45.39 MB/sec


むう、DMA の効果は凄まじいな。なんで、Vine はデフォでオンにしないんだろう。
それにしても、 16 bit, 32 bit の差がほとんどないな。どっちにしようか。

それぞれ3回測定。
DMAオン、16 bit: 45.39 45.71 45.07 Ave. 45.39
DMAオン、32 bit: 45.39 45.71 45.71 Ave. 45.60

若干だけど、16ビットの勝ち。
ってなコトで、

# hdparm -d1 -c0 /dev/hda を、

/etc/rc.d/rc.local に、

追加しました。

にしても、マジで、DMA の威力は、すさまじい。
mozilla で、エロサイトの10枚近くをいっぺんに開いたときは、マウスカーソルが、
カクカクしていたのに、DMA = On にしてから、まったくしなくなった。

こんなコトなら、もっと早くやっておけばよかったよ。
















































戻る