paste というコマンドがあります。
2 つのファイルを行ごとに連結するするコマンドなのですが 何か“ちょっと違う”使い道がないか考えていました。 今回は、このコマンドでカンマ区切りのデータを作ってみたいと思います。
まずは paste コマンドのおさらい。
次の 2 つのファイル user.txt と color.txt を処理します。
sato suzuki watanabe yamada
red black white
この 2 つのファイルをを列ごとに連結します。
$ paste user.txt color.txt
sato red
suzuki black
watanabe white
yamada
デフォルトでは、列は TAB で連結されます。 color.txt が 1 行少ないので 最後の行は "yamada" のみ出力されます。
区切りを変えることもできます。
$ paste -d "=" user.txt color.txt sato=red suzuki=black watanabe=white yamada=
"-s" オプションを付けると、ファイルごとに 1 行になります。
$ paste -s user.txt color.txt
sato suzuki watanabe yamada
red black white
標準入力を受けることもできます。
$ cat color.txt | paste -s
red black white
これを利用することで、 標準入力を受けて カンマ区切りで出力することができます。
$ ls | paste -s -d ","
a.txt,b.txt,c.txt,d.txt
Linux の sort コマンドはソートする列を指定することができます。
次のテキストファイル( score.txt )を処理してみます。
yamada 90 tanaka 100 sato 64 suzuki 93
オプションなしのソートだと次のようになります。
$ sort score.txt
sato 64
suzuki 93
tanaka 100
yamada 90
2 列目でソートします。
$ sort -k 2,2 score.txt tanaka 100 sato 64 yamada 90 suzuki 93
"2,2" という指定は 「 2 列目から 2 列目まで」という意味で 2 列目のみを使ってソートするときの指定です。 "2" だけを指定すると 「 2 列目から最後まで」という意味になります。
数字が“数値”として認識されていないので ソート順が変です。 "-n" オプションで、数値を“数値”と認識させます。
$ sort -k 2,2 -n score.txt sato 64 yamada 90 suzuki 93 tanaka 100
ついでに 値の大きい順(降順)にします。
$ sort -k 2,2 -n -r score.txt tanaka 100 suzuki 93 yamada 90 sato 64
ソートできました。
CSV ファイルのように列の区切り文字が空白でないときは 次のように "-t" オプションで区切り文字を指定できます。
$ sort -k 2,2 -n -r -t "," score.txt
テキストを扱う awk というコマンドがあります。
このコマンド、かなり便利なのですが、 できることが多過ぎるので覚えるのは結構大変だったりします。 「基本的な使い方はわかるけど・・・」という人も多いのではないでしょうか。 自分へのメモの意味も含めて機能を紹介したいと思います。
次のテキストを処理します。( test.txt )
1 2 3 4 5 6 7 8 9 10 11 12
まず基本的な使い方です。
$ cat test.txt | awk '{print $2}'
2
5
8
11
awk の書式で {} の前にはパターンを書くことができます。
{} の前に何も書かないのは、全ての行にマッチ(全ての行に対して処理をする)という指定になります。 (これについてはまた別の機会に詳しく書きたいと思います)
今回は、BEGIN と END という特殊な指定を使いますが、BEGIN は「最初の行の前」にマッチする指定で END は「最後の行の後」にマッチする指定です。これを使ってヘッダーやフッターを出力します。
次のような指定ができます。
$ cat test.txt | \ > awk 'BEGIN {print "-- header --"} END {print "-- footer --"}' -- header -- -- footer --
BEGIN と END の指定しかないので、ヘッダーとフッターのみが出力されました。
プログラムの部分が長くなるので、別ファイル( prog.txt )に指定して 引数で読み込むようにします。
次のような指定をしてみます。
BEGIN { print " f1 | f2 | f3 "; print "----+----+----"; } { printf("%4d|%4d|%4d\n", $1, $2, $3); }
BEGIN (前半)と 全ての行にマッチする指定(後半)をしました。
次のような結果になります。
$ cat test.txt | awk -f prog.txt f1 | f2 | f3 ----+----+---- 1| 2| 3 4| 5| 6 7| 8| 9 10| 11| 12
ヘッダーと本体が出力されました。
次はフッターに合計行を出したいと思います。
awk は計算もできます。
BEGIN { print " f1 | f2 | f3 "; print "----+----+----"; f1=0; f2=0; f3=0; } { printf("%4d|%4d|%4d\n", $1, $2, $3); f1=f1+$1; f2=f2+$2; f3=f3+$3; } END { print "----+----+----"; printf("%4d|%4d|%4d\n", f1, f2, f3); }
初期化処理は BEGIN に書くことができます。
次のような結果になります。
$ cat test.txt | awk -f prog.txt
f1 | f2 | f3
----+----+----
1| 2| 3
4| 5| 6
7| 8| 9
10| 11| 12
----+----+----
22| 26| 30
合計行を出力することができました。
ちょっとしたときにサッと書けるとカッコ良いですね。
「ファイルを vi で開くと間違って上書き保存してしまうのが怖い」と 言われたことがあります。 vi を終了する際に ":wq" と打ってしまうそうなのですが これでは確かに更新日時が変わってしまいます。
そこで view というコマンドがあります。
$ view a.txt
このコマンドはファイルを vi の読み取りモードの "-R" オプションを付けた状態で開いてくれます。
この状態であれば ":w" で保存しようとしても「読み取り専用です」とエラーになります。 ただし ":w!" のような強制保存はできてしまうので注意して下さい。
vi の操作で保存だけしたくない、というときに安心なコマンドです。
CSS の visited を利用してブラウザの訪問履歴を取得されうるユーザは 76 % 以上に上る - Slashdot.jp
というような記事があったのですが、理屈はわかるものの 具体的な実装方法が思いつかないので 調べてみました。
getComputedStyle や currentStyle 辺りを使って visited の色に変更されているかを確認するようですね。
下のサイトなどを
参考に IE6 にも対応する形で作ってみました。
気になる人は HTML ソースを見てください。
(動作確認 IE6 Firefox3.6 )
【参考サイト】
getComputedStyle について調べてたら深みにハマったのでメモ - IT戦記
Yahooo! JAPAN のリンクをいくつか貼ってみました。 「訪問済みチェック」をクリックしてみてください。 URL の方をクリックすると、そのページにジャンプします。
訪問済みチェック → http://www.yahoo.co.jp/
訪問済みチェック → http://gourmet.yahoo.co.jp/
訪問済みチェック → http://realestate.yahoo.co.jp/
訪問済みチェック → http://variety.yahoo.co.jp/
ちなみに次期バージョンの Firefox では対策されるそうです。
find コマンドは 色々な条件でファイルを探してリストを出力してくれる 便利なコマンドです。 しかし、全てのオプションは とても覚えきれません。 そこで今回は“最低限これだけは”という内容に絞って 紹介したいと思います。
まずはパスの指定です。
find コマンドは指定したパス以下を検索します。
パスの指定をしないと カレントディレクトリを指定したことになります。 また、パスの指定によって結果の表示も変わってしまいます。 (オプションで変更することはできますが、今回は割愛します)
例えば、パスを「相対パス」で指定した場合、次のように 結果の出力も相対パスになります。
$ find ./hogehoge
./hogehoge
./hogehoge/a.txt
./hogehoge/b.txt
「絶対パス」で指定すれば 結果も絶対パスになります。
$ find /home/hogehoge
/home/hogehoge
/home/hogehoge/a.txt
/home/hogehoge/b.txt
次に抽出条件です。
多くの場合、「ファイル名」か「更新日」になると思います。
ファイル名は "-name" オプションで 条件を指定できます。
$ find . -name "*.txt" ./hogehoge/a.txt ./hogehoge/b.txt
この例では "*.txt" にマッチするファイルのみを抽出しました。 マッチングには "*" や "?" を使うことができます。
ただし、マッチングの対象になるのはパスの最後のエントリー名(上の例では "a.txt" や "b.txt")のみで、途中のパスは対象になりません。 ディレクトリ自体が最後のエントリーの場合は、そのディレクトリ名が マッチングの対象になります。
$ find . -name "hoge*" ./hogehoge
更新日は "-mtime" オプションで ファイルが更新されてからの時間が指定できます。
$ find . -mtime +3 ./hogehoge/a.txt
値の指定は、プラス "+" の場合 〜日以上前(上の例の場合 3 日以上前)で マイナス "-" の場合 〜日以内となります。
$ find . -mtime -3 ./hogehoge ./hogehoge/b.txt
取得したパスに対して処理を行ないたいときがあります。
例えば「 3 日以上前の zip ファイルを削除する」といった場合ですが 対象の取得は 次のようなオプションで指定できます。
$ find /var/backup -mtime +3 -name "*.zip" /var/backup/a.zip /var/backup/b.zip
これに対して処理をするわけですから イメージとしてはパイプを使って 次のようになります。
$ find /var/backup -mtime +3 -name "*.zip" | while read path > do > rm $path > done
同じ動作を "-exec" オプションで指定することができます。
$ find /var/backup -mtime +3 -name "*.zip" -exec rm {} \;
"-exec" 以降、"\;" までがコマンドになります。
"{}" の部分に取得されたパスが入ります。
その他のオプションでオススメなのは "-ls" です。 このオプションを付けると結果の出力を ls コマンドと同じような 形にしてくれます。
$ find . -ls 10767946 12 drwxr-xr-x 1 u g 4096 11月 20 2009 ./hogehoge 10768066 4 -rw-r--r-- 1 u g 512 11月 15 2009 ./hogehoge/a.txt 10768041 4 -rw-r--r-- 1 u g 512 11月 20 2009 ./hogehoge/b.txt
他にも色々なオプションがありますが 「どうしても使わないとならない」という場面以外では 他のコマンドと組み合わせて使う方が シンプルで見やすくなると思います。
sh などでは変数を計算に使用できないため 次のように expr コマンドを使って計算します。
$ echo `expr 3 + 22` 25
$ A=15 $ B=`expr $A - 12` $ echo $B 3
Bash では $ + 二重カッコ "$(( ))" で計算ができます。
$ echo $((3 + 22)) 25
$ A=15 $ B=$(($A - 12)) $ echo $B 3
カッコ内の変数は $ を省略できます。
$ A=15 $ B=$((A - 12)) $ echo $B 3
計算するだけの場合、カッコの前の $ は不要です。
$ A=15 $ ((B = A * 2)) $ echo $B 30
使用した例は、ちょこちょこ出していたのですが メモ代わりに単独でネタにしておきます。
オプションを付けずに echo を使うと 行末に改行が付きます。
$ echo ABC; echo XYZ
ABC
XYZ
"-n" オプションを付けることで 改行なしにできます。
$ echo -n ABC; echo -n XYZ ABCXYZ
FTP コマンドで 接続先サーバのファイルの属性を変える場合 "quote site" コマンドを使用します。
まずは FTP サーバに接続します。
C:\> ftp 192.168.1.100
quote site コマンドの後ろは 通常の chmod コマンドのように 「属性」「ファイル名」を指定します。
ftp> quote site chmod 755 test.txt
使い方はこれで終わりですが 実はこれは FTP サーバ側で chmod の使用がサポートされている必要があります。
そもそも quote は 接続先に直接コマンドを送信するコマンドで site は、接続先でサポートしているコマンドを 実行するコマンドなのです。
chmod がサポートされているかどうかは "quote site" の後ろに "help" を指定して確認します。
ftp> quote site help 214- The following SITE commands are recognized (* =>'s unimplement UMASK IDLE CHMOD HELP 214 Direct comments to ftp-bugs@KURO-BOX1.
上の例の FTP サーバでは
chmod の他にも umask、idle が
サポートされています。
( * が付いている場合はサポートされていません)
いきなり PREPARE と書いても 知らない人は「何それ?」となると思います。 PREPARE は PostgreSQL において SQL 文の予約をしてくれるメソッドです。 SQL 文の一時的な関数化と考えても良いかもしれません。
実際の使い方ですが、次のように宣言します。
db=# PREPARE sql_1 AS SELECT tablename from pg_tables; PREPARE
これで sql_1 という名前で登録できました。
予約した SQL 文を実行するには EXECUTE を使用します。
db=# EXECUTE sql_1; tablename ------------------------- sql_features sql_implementation_info sql_languages sql_packages sql_sizing sql_sizing_profiles
PREPARE には SELECT,INSERT,UPDATE,DELETE が使用できて 接続が切れるまで有効です。
SQL 文中の値を引数で変えることもできます。
db=# PREPARE sql_2 (varchar) AS SELECT tablename db-# from pg_tables db-# where tablename = $1; PREPARE
引数は 1つめから順番に 変数 $1,$2,$3... で受けます。
EXECUTE で実行するときに値を指定します。
db=# EXECUTE sql_2('pg_index');
tablename
-----------
pg_index
(1 row)
大きなメリットとして EXECUTE したときに実行計画などの準備をしないため ( PREPARE したときに準備されます) 同じ SQL 文を何度も使用する場合、速度が上がります。
cal コマンドで カレンダーを表示することができます。
$ cal 5月 2010 日 月 火 水 木 金 土 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 $ cal 9 2010 9月 2010 日 月 火 水 木 金 土 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
.bash_profile に入れてログイン時にカレンダーを表示させたり ちょっと曜日を知りたい時に使えるコマンドです。
ただ、私の場合 カレンダーは月曜日が先頭なのが嬉しいのですが 最近の cal はそんなオプション "-m" もあるようです。
$ cal -m 5月 2010 月 火 水 木 金 土 日 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
他にも年単位の表示や...
$ cal -y 2010 1月 2月 3月 日 月 火 水 木 金 土 日 月 火 水 木 金 土 日 月 火 水 木 金 土 1 2 1 2 3 4 5 6 1 2 3 4 5 6 3 4 5 6 7 8 9 7 8 9 10 11 12 13 7 8 9 10 11 12 13 10 11 12 13 14 15 16 14 15 16 17 18 19 20 14 15 16 17 18 19 20 17 18 19 20 21 22 23 21 22 23 24 25 26 27 21 22 23 24 25 26 27 24 25 26 27 28 29 30 28 28 29 30 31 31 4月 5月 6月 日 月 火 水 木 金 土 日 月 火 水 木 金 土 日 月 火 水 木 金 土 1 2 3 1 1 2 3 4 5 4 5 6 7 8 9 10 2 3 4 5 6 7 8 6 7 8 9 10 11 12 11 12 13 14 15 16 17 9 10 11 12 13 14 15 13 14 15 16 17 18 19 18 19 20 21 22 23 24 16 17 18 19 20 21 22 20 21 22 23 24 25 26 25 26 27 28 29 30 23 24 25 26 27 28 29 27 28 29 30 30 31 7月 8月 9月 日 月 火 水 木 金 土 日 月 火 水 木 金 土 日 月 火 水 木 金 土 1 2 3 1 2 3 4 5 6 7 1 2 3 4 4 5 6 7 8 9 10 8 9 10 11 12 13 14 5 6 7 8 9 10 11 11 12 13 14 15 16 17 15 16 17 18 19 20 21 12 13 14 15 16 17 18 18 19 20 21 22 23 24 22 23 24 25 26 27 28 19 20 21 22 23 24 25 25 26 27 28 29 30 31 29 30 31 26 27 28 29 30 10月 11月 12月 日 月 火 水 木 金 土 日 月 火 水 木 金 土 日 月 火 水 木 金 土 1 2 1 2 3 4 5 6 1 2 3 4 3 4 5 6 7 8 9 7 8 9 10 11 12 13 5 6 7 8 9 10 11 10 11 12 13 14 15 16 14 15 16 17 18 19 20 12 13 14 15 16 17 18 17 18 19 20 21 22 23 21 22 23 24 25 26 27 19 20 21 22 23 24 25 24 25 26 27 28 29 30 28 29 30 26 27 28 29 30 31 31
前後 1 ヵ月ずつの表示もあります。
$ cal -3 4月 2010 5月 2010 6月 2010 日 月 火 水 木 金 土 日 月 火 水 木 金 土 日 月 火 水 木 金 土 1 2 3 1 1 2 3 4 5 4 5 6 7 8 9 10 2 3 4 5 6 7 8 6 7 8 9 10 11 12 11 12 13 14 15 16 17 9 10 11 12 13 14 15 13 14 15 16 17 18 19 18 19 20 21 22 23 24 16 17 18 19 20 21 22 20 21 22 23 24 25 26 25 26 27 28 29 30 23 24 25 26 27 28 29 27 28 29 30 30 31
ものすごい小ネタですが 知っていると便利です。
cd コマンドはディレクトリを移動することができます。
~:$ cd /var/log/apache2 /var/log/apache2:$ cd /etc/apache2/conf.d /etc/apache2/conf.d:$
1 つ前のディレクトリに戻りたくなったときは 次のように パスの代わりにハイフン "-" を指定します。
/etc/apache2/conf.d:$ cd - /var/log/apache2:$
履歴で持っているわけではないので 繰り返しハイフンを指定しても 2 つのディレクトリを行き来するだけです。
/etc/apache2/conf.d:$ cd - /var/log/apache2:$ cd - /etc/apache2/conf.d:$ cd - /var/log/apache2:$
ログと設定ファイルのディレクトリを 行き来するときなど便利です。
Unix/Linux には ファイルの所有権を変更する chown というコマンドがあります。 このコマンドは ユーザだけでなくグループも同時に変更することができます。
所有権のユーザだけ変える書式は次のようになります。
# chown testuser1 /home/testuser1/test.txt
グループも同時に変える場合は コロン ":" で区切って グループ名を指定します。
# chown testuser1:testgroup1 /home/testuser1/test.txt
GNU 版では、コロンの代わりに ドット "." も使えますが プロキシの認証などユーザの区切りに コロンはよく使用するので コロンで覚えておく方が無難だと思います。
ユーザ名とコロンだけで グループ名を指定しない場合は 指定したユーザ名(下の場合は testuser1 )の ログイングループを指定したことになります。
# chown testuser1: /home/testuser1/test.txt
ログイングループを調べなくても良いので 覚えておくと便利です。
上の例とは逆にユーザ名を指定しない場合は グループの変更になります。 これは chgrp と同じです。
# chown :testgroup1 /home/testuser1/test.txt
オマケですが、cp などのコマンドと同様に -R オプションで再帰(サブディレクトリ以下にも適用)ができます。
# chown -R testuser1:testgroup1 /home/testuser1
Excel には「連続データの作成」という便利な技があります。
よく上の図のようにマウスで範囲を広げて生成しているのを 見かけるのですが、範囲が広い場合、マウスがスライドし過ぎて かなり下の行まで行ってしまうことがあります。
これを防ぐというか、 そもそも「連続データの作成」は、『フィル』という機能の中にあるので 編集メニューから選んで実行することができます。
まず範囲を選択します。 このときはドラッグ&ドロップする必要はないので [Shift] キーなどを使ってゆっくり選択できます。
次にメニューから「編集」→「フィル」→「連続データの作成」と 選択します。
ポップアップウィンドウが出ます。
1 ずつ加算していく場合はデフォルトで OK です。
これで連続データが作成できました。
『フィル』には他にも機能がありますが あまり使うことはないと思います。 ドラッグ&ドロップによる「連続データの生成」で マウスが滑って どうしても上手く選択できないときに この機能を思い出してみてください。
先日、なにわオラクル倶楽部で 10point のノベルティの 『 Oracle キティちゃん』をゲットしました。
なにわオラクル倶楽部 というのは オラクルの西日本支社が主催して行なっている 技術者向けのコミュニティです。
過去にも紹介しましたが、隔週水曜日の 18:30 〜 20:00 の時間帯で 質の高い講習を実施してくれるので Oracle 初心者の新人プログラマなんかにも 役に立つ実戦的な勉強会です。
また、ノベルティとして、3 回目、5 回目、10 回目の 参加で Oracle のグッズをくれます。 毎回参加シールを貰えるので それを会員カードの裏に貼っていきます。
記念品を貰うために行くわけではありませんが そんなちょっとした遊びを交えて 楽しく勉強していく形は とても面白いと感じます。
オラクル社では支店ごとに 「どさんこオラクル倶楽部(北海道支店)」 「オラクルイヌワシ倶楽部(東北支店)」 「ほ!Clickオラクル倶楽部(北陸支店)」 「よかたいオラクル倶楽部(九州支店)」 「おらくる人倶楽部(沖縄支店)」 といった形でコミュニティを設けています。
開催形式はコミュニティごとに異なるようですので 興味がある人は 近くで開催されているものを調べてみると良いと思います。