技術者になりたい何か

技術者になりたい何かの覚書的な何かです

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_の後ろにくっつく。

 

 

  

[改訂第3版]Linuxコマンドポケットリファレンス

[改訂第3版]Linuxコマンドポケットリファレンス