この記事は生命科学研究を念頭においたLinuxシェルコマンドの初級記事で、前回までの続きになります。
今回は複数のコマンドを連結するパイプとコマンド置換を中心に、ファイルの移動・コピーをするコマンドや、検索をするgrepコマンドなどを紹介していきます。
ファイルの移動とコピー、削除
前回まで、つまりバイオ研究のためのLinuxシェルコマンド超入門 【まずはこの6コマンドから】と生命科学のためのLinuxシェルコマンドの基本1 【リダイレクトとオプション】では、
touch ファイルの作成
について紹介しました。今回は、作ったファイルの移動・コピーと、削除の方法について見ていきます。
まずtouchコマンドでsample.txtという空のファイルを作り、これを新しく作ったtempというディレクトリの中に移動してみます。
移動はmvコマンド (moveの意) で行い、mv ファイル名 移動先のディレクトリという構文になります。
touch sample.txt
mkdir temp
mv sample.txt temp/
これを元に戻してみます。
mv temp/sample.txt .
ここで.は現在のディレクトリを意味する記号です。
mvの移動先としてディレクトリを指定するというのを見ましたが、ディレクトリ名ではなくファイル名にするとその名前に変更するというコマンドになります。
例えばsample.txtをsample2.txtに変更するには
mv sample.txt sample2.txt
ファイルをコピーする場合はcpコマンド (copyの意)を使います。使い方はmvとほぼ同じです。sample2.txtというファイルをコピーし、新しくsample2_copied.txtというファイルを作りたいなら
cp sample2.txt sample2_copied.txt
ファイルの削除はrmコマンド (remove) で行います。
今作ったsample2_copied.txtを削除するには
rm sample2_copied.txt
すると消去していいか聞かれるので、yかn (yesかno) で答えます。
wcコマンドで行数・単語数を数える
wcコマンドを使えば、ファイルの中の行数や単語数を簡単に調べることができます。前回も使ったProtein1.fastaというファイルを題材にwcコマンドの使い方を確認してみます。
wc Protein1.fasta
出てくる3つの数字は、それぞれファイルの行数、単語数、バイト数 (容量) を意味しています。
wcコマンドにlオプションをつけると、行数だけ取り出すことができます (lはlineの意)。
wc -l Protein1.fasta
grepコマンドでマッチング
grepコマンドを使うことで、ファイルの中からある単語を検索することができます。
grep 検索単語 ファイル名という書き方になり、デフォルトでは該当する行が全部出力されます。
例えば前回も使ったProtein1.fastaという、あるタンパクのアミノ酸配列のFASTAファイルについて、ASという文字列を検索してみます。
grep AS Protein1.fasta
少しわかりにくいですね。ASにマッチするところに色をつけてみます。これはgrepコマンドに–color=AUTOをつければ可能です。
grep --color=AUTO AS Protein1.fasta
ASを含む行がいくつあるのかを数えるには, grepコマンドのcオプションを使います (cはcountの意)。
grep -c AS Protein1.fasta
ASが含まれる行を表示しましたが、もちろん含まれない行を抽出することもできます。それにはgrepコマンドのvオプションを使います。
grep -v AS Protein1.fasta
ASを含まない行を抽出することができました。
パイプを使ってコマンドを連結する
コマンドの出力結果を次の任意のコマンドに引き渡すことができます。これをパイプといい| (エルではなく、¥キーのところにある記号) で表します。
先程のgrepコマンドとwcコマンドをパイプでつないで、ASが含まれている行の文字数を調べてみます。
grep AS Protein1.fasta | wc -c
これはまずgrep AS Protein1.fastaが実行され、ASを含む行についてwc -cを実行するということになります。
パイプは複数使うこともでき、例えばASを検索した後、sortコマンドに送り (アルファベットの昇順に並べかえるコマンドです), それをheadに送り (デフォルトでは最初の10行を表示するコマンドですが、今回は最初の3行に絞り込むというオプション-n 3がついています), そして文字数をwcコマンドで数えるには
grep AS Protein1.fasta | sort | head -n 3 | wc -c
と書くことで実行できます。
コマンド置換
以前書いたバイオ研究のためのLinuxシェルコマンド超入門 【まずはこの6コマンドから】という記事では、*によるワイルドカードやbrace展開を紹介していました。簡単におさらいすると、例えば
と書くと自動的に.txtで終わるファイルと解釈されたり、
と書いたら
ls protein1.fasta
ls protein2.fasta
と解釈されるというものでした。
このようなものをシェルの展開 (shell expansion) といいますが、shell expansionにはこれ以外によく使うものとしてコマンド置換 (command substitution) があります。
使い方はそれほど難しくなく、$(コマンド)と書くことで$()内のコマンドが先に実行され、その結果を使って次のコマンドを実行することができます。算数では ()の中を先に計算すると小学校で習いますが、同じように$()の中の方が優先順位が高いのです。
少し例を見ていきます。
例えば、
grep -c ">" Protein1.fasta
は> を含む行の数を表示します。
このコマンドを先に実行して、その結果を次に使いたいときには$()の中に書いておけばいいというわけです。
echo "There are $(grep -c ">" Protein1.fasta) entries in my FASTA file."
この結果は
という表示になります。
これは先に$()の中の
が実行され、その結果の1という数字を使って、次にechoコマンド
が実行されて表示されるということになっています。
このコマンド置換を使えば、例えば今日の日付が入ったディレクトリを作成できます。
まず、日付はdateコマンドで取得可能です。
date
dateコマンドには日付をどのように表示するかというさまざまなオプションがありますが、+%Fをつけることで日付の部分を別の形式で取得できるようになっています。
date +%F
これを使えば、あとはディレクトリを作るコマンドであるmkdirにわたすことで
mkdir results-$(date +%F)
results-日付というフォルダを作成できています。念の為lsコマンドで目的のものができたか確認しておきます。
ls -ltr
関連図書
この記事に関連した内容を紹介しているサイトや本はこちらです。
バイオ研究のためのLinuxシェルコマンド超入門 【まずはこの6コマンドから】
生命科学のためのLinuxシェルコマンドの基本1 【リダイレクトとオプション】
今日も【生命医学をハックする】 (@biomedicalhacks) をお読みいただきありがとうございました。当サイトの記事をもとに加筆した月2回のニュースレターも好評配信中ですので、よろしければこちらも合わせてどうぞ