コマンドラインについてのメモ
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 にしてから、まったくしなくなった。
こんなコトなら、もっと早くやっておけばよかったよ。