Linuxコマンドでの引用符のつかいかた
grepとかによく使う引用符。
種類
シングルクォーテーション('')
この中は全て文字列と解釈される。
ダブルクォーテーション(" ")
この中も文字列。
ただし変数が入っているときは展開される。
バッククォーテーション(` `)
この中にコマンドが入っていれば実行結果が展開される。
変数が入っているときは変数を展開し、中身のコマンドを実行する。
具体例
dateコマンドと変数DATEにdateをセットした時の出力を比べる
$ date
Fri Feb 24 11:57:36 JST 2017$ echo "date"
date
$ echo 'date'
date
$ echo `date`
Fri Feb 24 12:01:23 JST 2017
変数はないので、引用符内の「date」が文字列として扱われるか、コマンドとして扱われるかの違いのみ。
'' ""の中身は文字列として扱われるのでそのまま「date」を出力。
``の中身はコマンドとして解釈されて実行結果が展開されるので、$ dateの実行結果がechoされる。
変数にdateをせっと
$ DATE=date
これで$DATE=date
$ echo "$DATE"
date
$ echo '$DATE'
$DATE
$ echo `$DATE`
Fri Feb 24 12:03:44 JST 2017
二重引用符の時は$DATEの中身が展開される(=date)けど、コマンドとしては解釈されないので、ただ変数が展開された結果のdateが出力。
単一引用符の場合は中身が全て文字列として解釈されるので、中身の$DATEがそのまま文字列として出力される。
バッククォーテーションの場合は変数が展開⇒変数の中身のdateが実行されて、実行結果が出力される。
実用1
/var/log/messagesの最近のログからerror行を見よう
対象ファイル
# ls -1tr /var/log/ | grep messages
messages.4.gz
messages.3.gz
messages.2.gz
messages.1
messages
これだと.gzファイルが入っててめんどいので、圧縮前のmessages(現行)とmessages.1(一世代前)を対象にしてみる。
# ls -1tr /var/log/ | grep messages | tail -2
messages.1
messages
おk
①パイプで渡す
/var/log配下一覧表示→messagesが入ってるのを抜き出す→最後の2行(圧縮前のファイル)を抜き出す
→xargsでcatに渡す→errでgrep(-iなので大文字小文字両方引っかかる)
# cd /var/log/
# ls -1tr | grep messages | tail -2 | xargs cat | grep -i 'err'
Feb 20 03:40:48 debian kernel: [3258971.032714] hrtimer: interrupt took 19122757 ns
Feb 24 11:51:50 debian kernel: [3634205.930279] xfs: Unknown symbol setattr_prepare (err 0)
Feb 24 11:51:50 debian kernel: [3634205.932033] xfs: Unknown symbol posix_acl_update_mode (err 0)
Feb 24 11:51:50 debian kernel: [3634205.939188] jfs: Unknown symbol setattr_prepare (err 0)
Feb 24 11:51:50 debian kernel: [3634205.939595] jfs: Unknown symbol posix_acl_update_mode (err 0)
Feb 24 11:51:50 debian kernel: [3634205.948860] fat: Unknown symbol setattr_prepare (err 0)
Feb 24 11:51:50 debian kernel: [3634205.950338] fat: Unknown symbol setattr_prepare (err 0)
Feb 24 11:51:50 debian kernel: [3634205.953980] ntfs: Unknown symbol setattr_prepare (err 0)
Feb 24 11:51:50 debian kernel: [3634205.956213] minix: Unknown symbol setattr_prepare (err 0)
Feb 24 11:51:50 debian kernel: [3634205.958425] hfs: Unknown symbol setattr_prepare (err 0)
Feb 24 11:51:50 debian kernel: [3634205.960883] hfsplus: Unknown symbol setattr_prepare (err 0)
Feb 24 11:51:50 debian kernel: [3634205.964232] ufs: Unknown symbol setattr_prepare (err 0)
Feb 24 11:51:50 debian kernel: [3634205.969289] btrfs: Unknown symbol setattr_prepare (err 0)
Feb 24 11:51:50 debian kernel: [3634205.969787] btrfs: Unknown symbol posix_acl_update_mode (err 0)
Feb 24 11:55:46 debian kernel: [ 3.199508] ACPI: Using IOAPIC for interrupt routing
Feb 24 11:55:46 debian kernel: [ 3.409457] ACPI: PCI Interrupt Link [LNKA] (IRQs 3 4 5 6 7 *9 10 11 14 15)
Feb 24 11:55:46 debian kernel: [ 3.409526] ACPI: PCI Interrupt Link [LNKB] (IRQs 3 4 5 6 7 9 10 *11 14 15)
Feb 24 11:55:46 debian kernel: [ 3.409591] ACPI: PCI Interrupt Link [LNKC] (IRQs 3 4 5 6 7 9 *10 11 14 15)
Feb 24 11:55:46 debian kernel: [ 3.409654] ACPI: PCI Interrupt Link [LNKD] (IRQs 3 4 5 6 *7 9 10 11 14 15)
Feb 24 11:55:46 debian kernel: [ 3.862607] pcieport 0000:00:15.0: Signaling PME through PCIe PME interrupt
Feb 24 11:55:46 debian kernel: [ 3.862716] pcieport 0000:00:15.1: Signaling PME through PCIe PME interrupt
~~省略~~
errだけじゃなくてInt「err」uptとかも引っかかってる。
抜くならgrep -iv 'interrupt'とか重ねれば良いんだけど、そうするとinterruptとerrと両方含まれる行も弾かれる・・・
②grepの引数に``でくくったコマンドをせっと
# grep -i 'err' `ls -1tr | grep messages | tail -2`
messages:Feb 20 03:40:48 debian kernel: [3258971.032714] hrtimer: interrupt took 19122757 ns
messages:Feb 24 11:51:50 debian kernel: [3634205.930279] xfs: Unknown symbol setattr_prepare (err 0)
messages:Feb 24 11:51:50 debian kernel: [3634205.932033] xfs: Unknown symbol posix_acl_update_mode (err 0)
messages:Feb 24 11:51:50 debian kernel: [3634205.939188] jfs: Unknown symbol setattr_prepare (err 0)
messages:Feb 24 11:51:50 debian kernel: [3634205.939595] jfs: Unknown symbol posix_acl_update_mode (err 0)
messages:Feb 24 11:51:50 debian kernel: [3634205.948860] fat: Unknown symbol setattr_prepare (err 0)
messages:Feb 24 11:51:50 debian kernel: [3634205.950338] fat: Unknown symbol setattr_prepare (err 0)
messages:Feb 24 11:51:50 debian kernel: [3634205.953980] ntfs: Unknown symbol setattr_prepare (err 0)
messages:Feb 24 11:51:50 debian kernel: [3634205.956213] minix: Unknown symbol setattr_prepare (err 0)
messages:Feb 24 11:51:50 debian kernel: [3634205.958425] hfs: Unknown symbol setattr_prepare (err 0)
messages:Feb 24 11:51:50 debian kernel: [3634205.960883] hfsplus: Unknown symbol setattr_prepare (err 0)
messages:Feb 24 11:51:50 debian kernel: [3634205.964232] ufs: Unknown symbol setattr_prepare (err 0)
messages:Feb 24 11:51:50 debian kernel: [3634205.969289] btrfs: Unknown symbol setattr_prepare (err 0)
messages:Feb 24 11:51:50 debian kernel: [3634205.969787] btrfs: Unknown symbol posix_acl_update_mode (err 0)
messages:Feb 24 11:55:46 debian kernel: [ 3.199508] ACPI: Using IOAPIC for interrupt routing
messages:Feb 24 11:55:46 debian kernel: [ 3.409457] ACPI: PCI Interrupt Link [LNKA] (IRQs 3 4 5 6 7 *9 10 11 14 15)
messages:Feb 24 11:55:46 debian kernel: [ 3.409526] ACPI: PCI Interrupt Link [LNKB] (IRQs 3 4 5 6 7 9 10 *11 14 15)
messages:Feb 24 11:55:46 debian kernel: [ 3.409591] ACPI: PCI Interrupt Link [LNKC] (IRQs 3 4 5 6 7 9 *10 11 14 15)
messages:Feb 24 11:55:46 debian kernel: [ 3.409654] ACPI: PCI Interrupt Link [LNKD] (IRQs 3 4 5 6 *7 9 10 11 14 15)~~省略~~
いきなりgrepするので、1カラム目にファイル名が出力される。
後の結果は同じ。
``の中のコマンドは展開されて実行されるので、
ls -1tr | grep messages | tail -2の結果がgrep -i 'err'の引数として渡される。
grep -i 'err' messages.1 messages
とおなじになっているはず。
ちなみに-hをつけると先頭カラムのファイル名が出力されない。
# grep -ih 'err' `ls -1tr | grep messages | tail -2`
Feb 20 03:40:48 debian kernel: [3258971.032714] hrtimer: interrupt took 19122757 ns
Feb 24 11:51:50 debian kernel: [3634205.930279] xfs: Unknown symbol setattr_prepare (err 0)
Feb 24 11:51:50 debian kernel: [3634205.932033] xfs: Unknown symbol posix_acl_update_mode (err 0)
Feb 24 11:51:50 debian kernel: [3634205.939188] jfs: Unknown symbol setattr_prepare (err 0)
Feb 24 11:51:50 debian kernel: [3634205.939595] jfs: Unknown symbol posix_acl_update_mode (err 0)
Feb 24 11:51:50 debian kernel: [3634205.948860] fat: Unknown symbol setattr_prepare (err 0)
Feb 24 11:51:50 debian kernel: [3634205.950338] fat: Unknown symbol setattr_prepare (err 0)
Feb 24 11:51:50 debian kernel: [3634205.953980] ntfs: Unknown symbol setattr_prepare (err 0)
Feb 24 11:51:50 debian kernel: [3634205.956213] minix: Unknown symbol setattr_prepare (err 0)
Feb 24 11:51:50 debian kernel: [3634205.958425] hfs: Unknown symbol setattr_prepare (err 0)
Feb 24 11:51:50 debian kernel: [3634205.960883] hfsplus: Unknown symbol setattr_prepare (err 0)
Feb 24 11:51:50 debian kernel: [3634205.964232] ufs: Unknown symbol setattr_prepare (err 0)
Feb 24 11:51:50 debian kernel: [3634205.969289] btrfs: Unknown symbol setattr_prepare (err 0)
Feb 24 11:51:50 debian kernel: [3634205.969787] btrfs: Unknown symbol posix_acl_update_mode (err 0)
Feb 24 11:55:46 debian kernel: [ 3.199508] ACPI: Using IOAPIC for interrupt routing
実用2
ファイル名に日付を付けたい
$ date +%Y%m%d
20170224
$ touch test`date +%Y%m%d`
$ ls
test20170224
$ tar cvzf ./backup/files_`date +%Y%m%d`.tar.gz files
$ ls backup/
files_20170224.tar.gz
今いるディレクトリ内のfilesフォルダをtarでアーカイブ&圧縮。
圧縮ファイル名をfiles_日付.tar.gzで固める。
``で囲った中のdateコマンドがオプション付きで実行されて、files_の後ろにくっつく。