現在使っているshellを確認 (echo, 環境変数)

echo $SHELL

shellを変更 (chsh)

chsh
hoge のシェルを変更します。
Password:
新しいシェル [/bin/bash]: /bin/tcsh
シェルを変更しました。

2つのファイルを行単位で結合する (paste)

pasteコマンドを使うと、 指定した2つのファイルのそれぞれの行をタブ(デフォルトの場合)で区切って結合することができる。

  • file1.txt
    a
    b
    c
  • file2.txt
    1
    2
    3

上記のfile1.txtとfile2.txtをpasteコマンドで結合すると、以下のようになる。

paste file1.txt file2.txt > file3.txt
  • file3.txt
    a 1
    b 2
    c 3

参考

複数のファイルを連結して表示 (cat)

cat file1.txt file2.txt

連結して新しいファイルに出力

cat file1.txt file2.txt > file2.txt

データの途中を取り出して表示する (head, tail)

headとtailをパイプで繋ぐ

hoge.txtのm行目からn行目まで表示する。

head -n hoge.txt | tail +m

改行を空白に置換 (tr)

cat hoge.txt | tr '\012' ' '

空白を改行に置換

echo 'hoge huga' | sed 's: :\
:' | while read line;
do
    echo $line;
done;

正規表現

*零文字以上の任意の文字
?任意の一文字
[ ][]内のどれか一文字
[ - ]-で区切られた文字の範囲の一文字
[! ][]内以外のどれか一文字
\メタキャラクタを文字として扱う

コマンドの連続実行

;単純連続実行
&&正常終了した後に実行
||(本当は半角)正常終了しなかった後に実行

特殊な変数

$?直前に実行されたコマンドや戻り値
$0実行コマンド名
$1,$2,,,$n実行時引数
$*全引数
$@全引数(それぞれの引数がダブルクォーテーションで囲まれる)
$#引数の個数
$$当シェルのプロセスID
$!最後に呼び出されたバックグラウンドコマンドのプロセスID

文字列/整数比較演算子

=!=文字列比較
-eq-ne整数比較
-gt -ge-lt -legreater than, greater or equal, less than, less or equal

ファイル検査演算子

!否定(「! -d」とか)
-dディレクトリとして存在していれば真
-f通常のファイルとして存在していれば真
-hシンボリックリンクとして存在していれば真
-r読取り可能ファイルとして存在していれば真
-w書込み可能ファイルとして存在していれば真
-x実行可能ファイルとして存在していれば真
-z文字列の長さが零であれば真

論理結合

-aand, Cの「&&」
-oor, Cの「||」

「"」、「'」、「`」の違い

「"」ダブルクォーテーション、「'」シングルクォーテーション、「`」バッククォーテーションの意味は違う。

  • 'i'に'whoami'をセット:
    i=whoami

  • クォーテーション無し
    echo $i
    whoami

  • ダブルクォーテーション。変数の中身を表示。
    echo "$i"
    whoami

  • シングルクォーテーション。文字列をそのまま表示。
    echo '$i'
    $i

  • バッククォーテーション。変数の中身をコマンドとして実行。
    echo `$i`
    username

Examples are shown below:

if [ -f /etc/bashrc ]; then
     . /etc/bashrc
fi
if [ "$TERM" = "dumb" -o "$TERM" = "emacs" ]
then
  alias ls='/bin/ls -F'
else
  alias ls='/bin/ls -F --color=auto'
fi

シェル変数

変数名=値

で変数を設定できる。例えばh1という変数にhoge:192.168.0.1を設定する:

h1=hoge@192.168.0.1

以降この変数を使用する場合は変数の前に'$'をつける:

$h1

設定されている変数を全て表示するにはsetを使う:

set

特定の変数を表示するにはechoを使う:

echo $h1

変数を削除するにはunsetを使う:

unset h1

履歴を見る (history)

history

OR

cat /Users/USERNAME/.bash_history

履歴の長さを変える

add the following line to ".bash_profile" (or ".bashrc")

export HISTSIZE=9999
export HISTFILESIZE=999999

if you want to disable the history, add the following line

export HISTFILESIZE=0

文字コード

変換

nkf [options] [file]
-bバッファリングを行なう
-u出力時にバッファリングを行なわない
-jJISコードに変換する
-eEUCコードに変換する
-sShift-JISコードに変換する
-wUTF8コードに変換する
nkf -e hoge.jis > hoge.euc
注意
リダイレクトを忘れずに!

応用:Windows上で作成したテキストをLinuxに使用できるようにする

nkf -e -Lu sjis.txt > euc.txt
nkf -e -d sjis.txt > euc.txt

Windowsでは改行記号として“CR+LF”を用いるが,Linuxでは“LF”のみを用いる。「-L」オプションを付けて,続いて「u」を付けた場合は改行記号が「LF」になる。同様に「w」は「CR+LF」,「m」は「CR」になる。例では,文字コードを「EUC」,改行記号を「LF」に変換している。

チェック

kcc -c filename

改行コード

hexdump -c filename

「\r \n」がたくさんあればCR+LF、「\n」ばっかりならLFと判断する。

dateの出力ってそのままファイルの名前とかにするには適さないよね

date +"%Y%m%d_%H%M%S"
20161223_095733

cronを使い定期的にプロセスを実行する

「/etc/cron.{hourly,daily,weekly,monthly}」如何に実行可能なスクリプトを置く。 ファイル名に「.」が含まれると、そのスクリプトは実行されない。

参考

crontabを使い定期的にプロセスを実行する

terminal上で日本語名ファイルが文字化けしたら

Linuxで、日本語のディレクトリ名やファイル名があると、 『?\??????』のように文字化けします。このとき

  • ディレクトリへの移動ができない
  • ディレクトリの移動やコピー、削除、名前の変更ができない
  • ファイルが開けない
  • ファイルの移動やコピー、削除、ファイル名の変更ができない

などの不都合が起こり、とても不便。

このような時は、まず、

ls | nkf -e

と入力し、日本語のディレクトリ名・ファイル名を確認する。 確認した結果が、例えば、「あいうえお」というディレクトリ名だったら、

cd `printf "あいうえお" | nkf -s`

とすることで、『?\??????』というディレクトリに移動することが出来ます。 `〜`はコマンドの実行なので、 上記コマンドの意味は、「あいうえお」の出力を、SJISに変換したディレクトリに移動するという意。

プログラムの実行にかかった時間を計る

time ./hoge &
real    2m22.325s //実行に2分22秒325かかった
user    0m0.020s
sys     0m0.030s

一定時間後にプログラムを実行

sleep 10s; ./hoge

単位には、「s」「m」「h」が指定可。 sleepコマンドを実行している間は、当然のことながらそのシェルでの作業ができない。

ps aux|grep atd
at now + 1 hour
at> ls
at> date
at> ([Ctrl]+[D]キーを押す)
warning: commands will be executed using /bin/sh

atコマンドで予約したジョブを見るには、atqコマンドを使用する。 キャンセルしたいジョブ番号を引数として指定して、atrmコマンドを実行する。

時間の指定では、MM/DD/YYやhh:mmといった形式のほかにも、now、am、pm、noon、midnight、teatime、sun、mon、todayなどの時間を表す言葉が使用できる。

/tmpを/dev/shm上にマウントする

/tmpを/dev/shm上にマウントし高速なtemporary fileを目指す。 先ずはテスト:

mount -t tmpfs -o size=1024m /dev/shm /tmp
Filesystem           1K-blocks      Used Available Use% Mounted on
tmpfs                  4087192         0   4087192   0% /dev/shm
/dev/shm               2097152         0   2097152   0% /tmp

/etc/fstabに書き込む。メモリーが8GBなので、半分をtmpfsにし、その半分を/tmpとする:

tmpfs                   /dev/shm                tmpfs   defaults,size=4096m        0 0
/dev/shm                /tmp                    tmpfs   defaults,size=2048m        0 0

reboot, then check:

tmpfs                  4194304         0   4194304   0% /dev/shm
/dev/shm               2097152        48   2097104   1% /tmp

/tmpと/dev/shmの定期掃除の実行(/etc/cron.daily/tmpwatch):

/usr/sbin/tmpwatch -x /tmp/.X11-unix -x /tmp/.XIM-unix -x /tmp/.font-unix \
-x /tmp/.ICE-unix -x /tmp/.Test-unix 240 /tmp
/usr/sbin/tmpwatch 720 /var/tmp
/usr/sbin/tmpwatch 240 /dev/shm

ldd

プログラムが使う共有ライブラリを調べる

ldd test
chinone@magi:~/workspace/CPP/test/mpfr$ ldd test
       linux-gate.so.1 =>  (0xffffe000)
       libmpfr.so.1 => /usr/lib/libmpfr.so.1 (0x4002d000)
       libm.so.6 => /lib/tls/libm.so.6 (0x40060000)
       libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x40085000)
       libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x4013f000)
       libcxaguard.so.5 => /opt/intel/cc/9.1.042/lib/libcxaguard.so.5 (0x4014b000)
       libc.so.6 => /lib/tls/libc.so.6 (0x4014d000)
       libdl.so.2 => /lib/tls/libdl.so.2 (0x4027f000)
       libgmp.so.3 => /usr/lib/libgmp.so.3 (0x40283000)

xargs

Argument list too long (引数リストが長すぎます)エラーに xargs で対応する

大量のファイルを「mv」、「rm」、「grep」等する際に、

  • Argument list too long.
  • Arg list too long.
  • 引数が多すぎます

とか言われる場合がある。 これを回避する為に「xargs」を使う。

findと組み合わせる。今カレントディレクトリに「mcmc_*」というファイルが大量にあったとする。

mv

これらファイルを全て「./tmp」に移動させることを考える。 当然

mv mcmc_* ./tmp

は実行できない状況を考える。

「find」との連携させる:

find ./ -name "mcmc_*" -print0 | xargs -0 -i mv {} ./tmp

「find」の「-print0」と「xargs」の「-0」オプションを使う。 「-i」はxargs に「{}」を引数リストに置き換えるということを伝えるために用いている。

rm

これらファイルを全て削除することを考える。 当然

rm -rf mcmc_*

は実行できない状況を考える。

「find」との連携させる:

find ./ -name "mcmc_*" -print0 | xargs -0 rm -rf

man

man <section> <title>
セクションによる検索
section分類内容
1コマンドの解説
2システムコール(C言語でプログラミングするときに使う)
3関数(C言語でプログラミングするときに使う)
4周辺装置の解説
5ファイル形式の解説
6ゲームの解説
7その他
8システム管理コマンド

nkf

nkf [options] [file]
-bバッファリングを行なう
-u出力時にバッファリングを行なわない
-jJISコードに変換する
-eEUCコードに変換する
-sShift-JISコードに変換する
-wUTF8コードに変換する
nkf -e hoge.jis > hoge.euc
注意
リダイレクトを忘れずに!

応用:Windows上で作成したテキストをLinuxに使用できるようにする

nkf -e -Lu sjis.txt > euc.txt
nkf -e -d sjis.txt > euc.txt

Windowsでは改行記号として“CR+LF”を用いるが,Linuxでは“LF”のみを用いる。「-L」オプションを付けて,続いて「u」を付けた場合は改行記号が「LF」になる。同様に「w」は「CR+LF」,「m」は「CR」になる。例では,文字コードを「EUC」,改行記号を「LF」に変換している。

kcc

kcc -c filename

hexdump

hexdump -c filename

「\r \n」がたくさんあればCR+LF、「\n」ばっかりならLFと判断する。

Procmail

メールの転送、フィルタリング、text -> html等

Fluxbox

VNCを使って遠隔地からデスクトップを操作することを考えて、 ウィンドウマネージャには警戒でシンプルな「Fluxbox」を使用している。

fluxboxはtwm程無味乾燥(シンプルすぎる)でもなく、 KDE・GNOME(かっこいいけどリモートからの操作にそれはただ無駄なだけ)程仰々しくないウィンドウマネージャである。

Fluxboxのウィンドウにはタイトルバーにタブが貼り付いている。 このタブが、Fluxboxの持つ最大の特徴のひとつと言っても過言ではないだろう。 任意のウィンドウのタブをマウスの第3ボタンでクリックし、そのまま別のウィンドウのタブまでドラッグ&ドロップしてみよう。 2つのウィンドウがグループ化されて統合される。 全面に表示するウィンドウの切り替えはタブの左クリックで行える。 まったく異なるアプリケーションのグループ化も可能だ。 グループ化を解除したい場合には、タブを第3ボタンでドラッグ&ドロップで切り離せばよい。

参考

圧縮ファイルを分割する (split)

split -b 1024m file.tgz file.tgz.part-
ls
file.tgz  file.tgz.part-aa  file.tgz.part-ab  file.tgz.part-ac  file.tgz.part-ad
cat file.tgz.part-a* > file.tgz.recovered
split_example]$ md5sum file.tgz file.tgz.recovered 
b4bea7854ad7b8a36567fb47bc54cfa6  file.tgz
b4bea7854ad7b8a36567fb47bc54cfa6  file.tgz.recovered

unpack directly

cat file.tgz.part-a* | tar zx

compress and split w/o any intermediate file

tar zcv file1 file2 | split -b 1024m - file.tgz.part-

and unpack

cat file.tgz.part-* | tar zxv