読者です 読者をやめる 読者になる 読者になる

技術者になりたい何か

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

Linuxコマンドを学んでいこう(基礎その2 コマンドをつなぐ)

コマンドの出力はつなげることができる。

主なつなぎ方は下記。

command1 | command2
command1の実行結果をcommand2に渡す。

command1 && command2
command1が正常終了した際のみcommand2を実行する。

command1 ; command2
command1に続いてcommand2を実行する。
command1の実行結果が正常でも異常でも関係ない。

command1 || command2
command1がエラー終了したときのみcommand2を実行する。

command1 & command2
command1 を実行しながら、command2 を実行する。
&でたくさんつなげても、ただ単に左から順番に実行していく。
;(セミコロン)は前のコマンドの完了を待つが、&は待たない。
また、&& は正常終了を待つが、& は待たない。
ちなみに $ command1 & でそのコマンドを実行し続けるので、バックグラウンドで動かす処理とかを立ち上げるときに使ったりもする。

command1 | command2

command1の実行結果をcommand2に渡す。

1.dmesgの結果からUSBを含むものだけ表示したい

dmesgの結果をパイプでgrepに渡す。ちなみに-iオプションで大文字小文字の区別なく抽出。

$ dmesg | grep -i "usb"
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
ehci_hcd 0000:00:1a.0: new USB bus registered, assigned bus number 1
ehci_hcd 0000:00:1a.0: USB 2.0 started, EHCI 1.00
usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb1: Product: EHCI Host Controller
usb usb1: Manufacturer: Linux 2.6.32-573.18.1.el6.x86_64 ehci_hcd
usb usb1: SerialNumber: 0000:00:1a.0
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
ehci_hcd 0000:00:1d.0: new USB bus registered, assigned bus number 2
ehci_hcd 0000:00:1d.0: USB 2.0 started, EHCI 1.00
usb usb2: New USB device found, idVendor=1d6b, idProduct=0002
usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb2: Product: EHCI Host Controller
usb usb2: Manufacturer: Linux 2.6.32-573.18.1.el6.x86_64 ehci_hcd
usb usb2: SerialNumber: 0000:00:1d.0
usb usb2: configuration #1 chosen from 1 choice
(以下略)

2.実行中のプロセスからhttpdを探したいけどgrep httpdは表示したくない。

ps -efで実行中プロセス全表示⇒httpdを含む行を抽出⇒grepを含む行を除外

$ ps -ef | grep "httpd" | grep -v "grep"
root 2325 1 0 Mar21 ? 00:00:11 /usr/sbin/httpd
apache 6012 2325 0 03:13 ? 00:00:00 /usr/sbin/httpd
apache 6013 2325 0 03:13 ? 00:00:00 /usr/sbin/httpd
apache 6014 2325 0 03:13 ? 00:00:00 /usr/sbin/httpd
apache 6015 2325 0 03:13 ? 00:00:00 /usr/sbin/httpd
apache 6016 2325 0 03:13 ? 00:00:00 /usr/sbin/httpd
apache 6017 2325 0 03:13 ? 00:00:00 /usr/sbin/httpd
apache 6018 2325 0 03:13 ? 00:00:00 /usr/sbin/httpd
apache 6019 2325 0 03:13 ? 00:00:00 /usr/sbin/httpd
apache 6397 2325 0 03:16 ? 00:00:00 /usr/sbin/httpd
apache 8800 2325 0 04:05 ? 00:00:00 /usr/sbin/httpd

3.findで見つけたファイルをまとめてcat,zcat(アーカイブを展開して中身表示)にわたして、その中から特定の文字を含む行を表示したい。

# find /var/log/apache2 -type f -name "error.log*" | grep -v "gz"| xargs cat | grep "redmine"
# find /var/log/apache2 -type f -name "error.log*" | grep "gz" | xargs zcat | grep "redmine"

上記の場合は/var/log/apache2にあるerror.logを含むファイルを抽出。ログローテで圧縮前と後で分ける。
⇒xargsでまとめてcat,zcatに渡す。
⇒その中からredmineを含む行を検索して表示する
という流れ。

command1 && command2

command1が正常終了した際のみcommand2を実行する。

$ sudo apt-get update && sudo apt-get upgrade

Debian系にてリポジトリのパッケージ情報の更新が正常にできたら、そのままパッケージの更新を行う。

 

command1 ; command2

command1に続いてcommand2を実行する。
command1の実行結果が正常でも異常でも関係ない。

# pwd ; whoami ; id ; w
/home/tmin
root
uid=0(root) gid=0(root) groups=0(root)
23:07:27 up 36 days, 12:17, 3 users, load average: 0.26, 0.11, 0.12
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
tmin :0 :0 13Jan17 ?xdm? 2:54m 0.44s gdm-session-worker [pam/gdm-password]
tmin pts/0 :0 13Jan17 36days 0.07s 0.07s bash
tmin pts/1 192.168.12.70 22:53 2.00s 0.14s 0.08s sshd: tmin [priv]

 カレントディレクトリ表示⇒自分のユーザ確認⇒ユーザ情報確認⇒他にログインしているユーザいないか確認。
単純につないで順に実行していくので、一連の複数コマンドを一行で書きたいときに便利。

 

command1 || command2

command1がエラー終了したときのみcommand2を実行する。

$ cat test.txt || vi test.txt

test.txtというファイルがない(とcat出来ないのでエラーとなる)場合のみ
viでtest.txtを新規作成して開く。
(とはいえこの場合viはそのファイルがあれば普通に開くし、無ければ新規作成で開くのであまり意味は無い)

1回目

$ cat test.txt || vi test.txt
cat: test.txt: そのようなファイルやディレクトリはありません

catのエラー表示がされて、viエディタで新規作成が立ち上がる。
insert modeで適当に文字を入力して保存。

2回目

$ cat test.txt || vi test.txt
tt

先程保存したtest.txtの中身がcatによって表示される。
catはエラー終了していないのでviは立ち上がらない。

 

command1 & command2

command1 を実行しながら、command2 を実行する。

 

$ conky &

conkyというデスクトップアプレットが動いて、端末は使えるようになる($ の入力待ち状態に戻る)。

# pwd & whoami & id & w
[1] 68597
/home/tmin
[2] 68598
[3] 68599
root
uid=0(root) gid=0(root) groups=0(root)
23:16:20 up 36 days, 12:26, 3 users, load average: 0.12, 0.11, 0.13
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
tmin :0 :0 13Jan17 ?xdm? 2:54m 0.44s gdm-session-worker [pam/gdm-password]
tmin pts/0 :0 13Jan17 36days 0.07s 0.07s bash
tmin pts/1 192.168.12.70 22:53 4.00s 0.14s 0.08s sshd: tmin [priv]
[1] Done pwd
[2]- Done whoami
[3]+ Done id

左から順に実行してるけど、前のコマンドの終了を待ってないのでpwd whoamaiが終了ステータス返すのが後ろの方になって入り乱れている。

基本的に&で複数コマンドをつなぐ使い方は少ないと思われ。
一つのコマンドの後ろに&つけて、バックグラウンドで実行という使い方は多い。

webアプリの起動とかで、プロンプト返ってこないときとかにこれ使うとよい。(終了が面倒かもしれないが)

 

 

 

 

まんがでわかるLinux シス管系女子(日経BP Next ICT選書)

まんがでわかるLinux シス管系女子(日経BP Next ICT選書)