Linux > Unix > Max OS X

Linux/Unix/Mac OS X

半永久的に未完成のページ。ちょびちょび書き足して行きます。


echo


echoコマンドは文字通り山びこのようなコマンドです。 echoの後ろに好きな言葉を打って、エンターを押すと

$echo hogehoge
hogehoge

とそっくりそのまま帰ってくる。 入力された物を、そのまま出力するような役割のコマンドである。一見、なんの使い道があるのかと 思いそうだが、このechoはC言語でいうprintf、fortranでいうwrite, printと同様の役割として 機能させることができる。その例を次に紹介しよう。


環境変数


環境変数とは、「変数」であるので、何かの値が代入されることになる。 デフォルトで環境変数は既に設定されているものもある。 例えば、PATH、SHELL、UESRなどがある。 もしそのPCのユーザー名が「Tenmongakusya」なら、

 echo $USER
Tenmongakusya

と表示される。 また環境変数の一覧は

env

と打つとみることができる。


・・・・


環境変数の設定はexportコマンドを使う。 最初に誰もが躓く(?)PATHの設定についてはまた時間のある時にまとめます。


正規表現


端末上で何かコマンドを実行すると結果が同じく端末上に表示させる。 しかし、長いスクリプトやプログラムなどを走らせる際に端末にあれこれ表示されると美しくない。 下記の方法を用いると、スクリプトの実行中に端末が美しくなり、さらにデータ処理もやりやすくなったりと ご利益多数です。

例えば、

$echo "ahooo" (入力)
ahooo (出力)

この出力先を指定した場合にリダイレクトコマンド

>  
>>

を用いる。例えば、

$echo "ahooo" > test.txt

とすると、echoで実行された結果がtest.txtに書き込まれる。つまり例えば、

$less "test.txt"
ahooo

という具体に。 では、この状態で

$echo "ahooo" >> test.txt

とすると、追加で書き込みされる。つまり、

$less "test.txt"
ahooo
ahooo

となる。 ">"は実行結果を、以前のデータを消去して、ファイルに記録する。 ">>"は追加で書き込みである。

さて、上のechoの例はいわゆる標準出力というもので、正常にコマンドが実行された場合の 手順である。世の中には標準エラー出力というものもあり、実行したコマンドにエラーが見つかると、 エラーメッセージとして端末に表示させる。 エラーメッセージをファイルに書き込む際は、

2>
2>>

と2という数字を指定する。1は標準出力、2は標準エラー出力を表す。 実はいうと、標準出力も

1>
1>>

とやってもできる。

パイプ

|

出力と入力をつなげるコマンド。 分かりやすい例がlsとgrepの組み合わせで、lsで表示された結果からさらに特定のファイルを抽出するとき

ls | grep hoge

とするとlsで表示された中から"hoge"という文字列を持つものを抜き出して表示します。 実行すれば分かると思いますが、lsの標準出力はターミナルには表示されません。 標準出力はパイプによって、grepコマンドに代入されます。


for


ループのコマンドである。

for loop in `jot $nloop` (Max OS X)
for loop in `seq $nloop` (Linux)

1から$nloopの値まで繰り返す。 Max OS XとLinuxではコマンドが微妙に異なるので、注意しましょう。


nkf


ファイルのエンコードを変更する。

nkf -g file: fileの文字コードを表示
nkf -e file: fileの文字コードをEUCに変換
nkf -s file: fileの文字コードをShift-JISに変換
nkf -w file: fileの文字コードをUTF-8に変換

など。


sed


ファイルの置換を行う。

sed 's/A/B/g' filename

でfilename内のAという文字をBに置き換えます。


if


スクリプトに置ける条件分岐のtipsです。

基本構文

基本的には下記の書き方をします。

if [ 条件 ]; then
  処理
fi

もしくは、

if [ 条件 ]; then
  処理1
else
  処理2
fi

または、

if [ 条件 ]; then
  処理1
elif [ 条件 ]; then
  処理2
else
  処理3
fi

です。また後で例を出しますが、スペースに位置に注意です。

条件分の書き方

条件を書く際に以下のようなオプションコマンドを指定する事で様々な条件を課すことができます。 よく使うのは、

-d: ファイルがディレクトリなら
-s: ファイルのサイズがゼロ以上なら
-e: ファイルが存在するなら

など。またその逆は!を付けて、

! -s: ファイルのサイズがゼロ以上でないなら

などとする。 よくある単純なエラーはスペースの有無に由来するもので、

if [ ! -s filename ]; then

が正しい。

参考

http://shellscript.sunone.me/if_and_test.html


awk


ファイル処理やスクリプトで大活躍のawkコマンドについてのあれこれ。
基本的には列の値を読み込む。

基本構文

awk '{printf $n}' filename

ここでnは列の値。(ただしファイルは空白で区切られている場合) とても便利である。


head, tail


awkはファイルの列のデータを読み取ったが、今度は特定の行のデータを読み取る。

head -n "filename" 

fileの頭からn行目までを取り出しなさい。

tail -m "filename"

fileの尾からm行目までを取り出しなさい。

n行目からm行目を切り取りたい時。 head -n m ファイル | tail -n (m-n+1) ファイルの先頭からm行目までを切り取りなさい。 そして、切り取ったファイルの最後の{m-n+1}行を表示しなさい。


その他、便利な操作


ファイルの行数をカウントしたい。

wc filename

でfilenameの行数、単語数、バイト数を表示させる。 それぞれ単独で表示させたかったら-c(バイト数), -w(単語数), -l(行数) のオプションをつければok。 例えば、

wc -l filename

など。

数値ファイルの列を読み取りたい

例えば、以下のようなカンマで区切られたファイルがあったとする。

0.10000E+04,0.000628,0.10812E-03
0.91116E+03,0.000690,0.13368E-03
0.83022E+03,0.000757,0.16095E-03
0.75646E+03,0.000831,0.19393E-03

そこでawkコマンドで各列のデータを取り出す。

awk -F ',' '{print $n}' filename

もしくは

awk -F ',' '{printf $n}' filename

とする。ここでprintとprintfの違いは、前者は改行を行い、後者は改行しない、という違いある。 ファイルが空白で区切られている場合は','を' 'とかえればよい。 例えば、

awk -F ',' '{print $1}' filename

を実行すると、

0.10000E+04
0.91116E+03
0.83022E+03
0.75646E+03

と表示される。

2つの行数が同じファイルを結合したい

例えば、 file1

a
b
c

file2

1
2
3

というファイルがあったとすると、

paste -d " " file1 file2 > file

とするとfileには

a 1
b 2
c 3

というファイルが作成させる。

paste -d, file1 file2 > file

とすると

a,1
b,2
c,3

とカンマで区切る事ができる。

最終更新:2015年05月05日 02:05
|新しいページ |検索 |ページ一覧 |RSS |@ウィキご利用ガイド |管理者にお問合せ
|ログイン|