Quantcast
Channel: CentOS –俺的備忘録 〜なんかいろいろ〜
Viewing all 498 articles
Browse latest View live

vmstatコマンドで覚えておきたい使い方8個

$
0
0

LinuxやUNIXでパフォーマンスを監視する際にはお約束とも言えるvmstatコマンド。
どの現場でもよく使われるものだが、今回はこのコマンドで覚えておきたい使い方を紹介する。

なお、この内容はCentOS 7にてバンドルされている「procps-ng 3.3.9」のバージョンのものを用いている。

1.基本的な使い方

オプション無しで実行すると、以下のように現時点でのパフォーマンス情報が出力される。

vmstat

20150719_000000

[root@test-centos7 ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0  80556    128 1391560    0    0     5     6    9    2  0  0 100  0  0

 

それぞれの表示の内容は、以下のようになっている。

procs

  • r … 実行待ち(プロセスが実行キューに入っている状態)になっているプロセス数
  • b … 本来は実行可能だが、何らかの理由によって処理が停止(スリープ)しているプロセス数

r(実行待ちプロセス数)がある場合、CPUの処理が追いついていないか、そのプロセスを実行しているプログラム自体の問題によって実行順が回ってきていないプロセスが存在する事になる。
b(処理停止プロセス数)がある場合、例えばディスクやネットワークのIO待ちをしていたが、プログラムの実行順番が来てしまったプロセスがあることになる。

どちらにしても、このプロセスの実行者からすれば処理が遅く感じられる可能性が高いので、少し注意した方がいい値。

memory

  • swpd … 使用されているスワップメモリー容量
  • free … 未使用のメモリー容量
  • buff … カーネルがバッファ領域として利用しているメモリー容量
  • cache … キャッシュとして用いられているメモリー容量

なお、一般的に動作時間が長くなるにつれて、このcache容量が大きくなっていく傾向があるが、これはLinuxで動作を早く行わせるためにディスクなどから事前にデータを読み込んでいるだけなので、あまり気にしなくて良い。
swpdの値も、後述するsi、soが頻繁に増減している状態でなければパフォーマンスにそこまで影響があるわけではない。

swap

  • si … スワップ領域に退避していたデータを物理メモリーに書き戻している(スワップイン)容量
  • so … 必要のないデータを物理メモリーからスワップ領域に書き込みしている(スワップアウト)容量

もしもこの項目が頻繁に動いているようであれば、パフォーマンスに悪影響を与えている可能性が高いので注意。基本的には、どちらの値も可能な限り0である状態がいい。
(swpdの容量が多くても、この項目があまり変動していないようであれば影響が大きくない)

io

  • bi … ブロックデバイス(HDDなど)からの読み取り容量
  • bo … ブロックデバイスへの書き込み容量

複数のHDDがある場合でも、その合計の値で出力される(HDDごとに値が出力されない)ので注意。
デバイス・パーティションごとのIO値を確認する場合は、後述する「-d」や「-p」オプションで確認すると良いだろう。

system

cpu

  • us … カーネルコード以外(OS以外。例えばphpやperlのスクリプトなど)の実行でCPUが使用された時間の割合
  • sy … カーネルコードの実行でCPUが使用された時間の割合
  • id … CPUがアイドル状態(何もしてない待機状態)だった際の時間の割合
  • wa … ディスク・ネットワークへのデータの入出力でIO待ちだった時間の割合
  • st … ゲストOSがリソース要求を行ったが、CPUリソースを割り当ててもらえなかった時間の割合

2.○秒ごとに定期実行させる

引数として間隔(秒単位)を指定することで、その間隔ごとにパフォーマンス情報を出力させることができる。

vmstat 実行間隔(秒)

20150720_000004

 

この実行間隔を指定してコマンドを実行すると、出力結果にヘッダーが定期的(コマンド実行時のウィンドウサイズによって行数が変動する)に挟まれてしまう。

20150720_000007

 

邪魔であれば、「-n」オプションを付与することでヘッダーを最初の1回(実行時に最初に挿入される分)のみに抑える事ができる。

vmstat -n 実行回数

 

なお、実行回数の後ろに更に数字を引数として与える事で、実行回数も指定することができる。

vmstat 実行間隔(秒) 実行回数

20150720_000006

3.メモリキャッシュのアクティブ/非アクティブ領域の内訳を確認する

「-a」オプションを付与することで、メモリキャッシュのアクティブ(利用中で、開放できない領域)/非アクティブ(最後に利用されてから一定時間が経過したため、すぐに廃棄できる領域)の内訳を確認することができる。

vmstat -a

20150720_000005

[root@test-centos7 ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0  95740    128 1365428    0    0     4     6    9    4  0  0 100  0  0
[root@test-centos7 ~]#
[root@test-centos7 ~]# vmstat -a
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
 1  0      0  95720 1273136 372676    0    0     4     6    9    4  0  0 100  0  0

 

比べて見るとわかるが、オプション無しとくらべて「buff」「cache」がなくなり、「inact」「active」がかわりに表示されている。

  • inact … 非アクティブ(最後に利用されてから一定時間が経過したため、内容をすぐに廃棄できる)な状態のメモリキャッシュの容量
  • active … アクティブ(何らかの形でシステムで利用中のため、開放できない)な状態のメモリキャッシュの容量

activeのメモリはすぐには利用できないので、free + inactの値が利用可能なメモリ容量だと考えるといいだろう。

4.パフォーマンス情報にタイムスタンプを付与する

「-t」オプションを付与することで、出力されるパフォーマンス情報にタイムスタンプを付与することができる。

vmstat -t

20150720_000009

[root@test-centos7 ~]# vmstat 1 -t
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- -----timestamp-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st                 JST
 1  0      0  95740    128 1365432    0    0     4     6    9    4  0  0 100  0  0 2015-07-20 10:19:15
 0  0      0  95732    128 1365432    0    0     0     0   66  115  0  0 100  0  0 2015-07-20 10:19:16
 0  0      0  95732    128 1365432    0    0     0     0   54   95  0  0 100  0  0 2015-07-20 10:19:17
 0  0      0  95732    128 1365432    0    0     0     0   72  127  0  0 100  0  0 2015-07-20 10:19:18
 0  0      0  95572    128 1365432    0    0     0     0  117  192  0  0 99  0  0 2015-07-20 10:19:19
 0  0      0  95572    128 1365432    0    0     0     0   60  100  0  0 100  0  0 2015-07-20 10:19:20
 0  0      0  95608    128 1365432    0    0     0     0   58  107  0  0 100  0  0 2015-07-20 10:19:21
 0  0      0  95608    128 1365432    0    0     0     0   57  104  0  0 100  0  0 2015-07-20 10:19:22
 0  0      0  95608    128 1365432    0    0     0     0   62  107  0  0 100  0  0 2015-07-20 10:19:23
 0  0      0  95608    128 1365432    0    0     0     0   61  108  0  0 100  0  0 2015-07-20 10:19:24
 0  0      0  95608    128 1365432    0    0     0     0   53   95  0  0 100  0  0 2015-07-20 10:19:25

5.表示される容量の単位を切り替える

通常、vmstatで表示される容量の単位はKB(キロバイト)となっているのだが、「-S」オプションでk(キロバイト)、m(メガバイト)を切り替える事もできる。

vmstat -S (k or m)

20150720_000010

[root@test-centos7 ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0  95824    128 1365432    0    0     4     6    9    4  0  0 100  0  0
[root@test-centos7 ~]#
[root@test-centos7 ~]# # キロバイト
[root@test-centos7 ~]# vmstat -S k
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0  98250    131 1398202    0    0     4     6    9    4  0  0 100  0  0
[root@test-centos7 ~]#
[root@test-centos7 ~]# # メガバイト
[root@test-centos7 ~]# vmstat -S m
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0     98      0   1398    0    0     4     6    9    4  0  0 100  0  0

6.各種カウンターの統計情報を出力する

「-s」オプションを付与すると、各種情報をその詳細な名称とともにリスト形式で出力させることができる。

vmstat -s

20150720_000011

[root@test-centos7 ~]# vmstat -s
      1885468 K total memory
      1789744 K used memory
       372696 K active memory
      1273132 K inactive memory
        95724 K free memory
          128 K buffer memory
      1365432 K swap cache
      2113532 K total swap
            0 K used swap
      2113532 K free swap
        76349 non-nice user cpu ticks
          282 nice user cpu ticks
        71973 system cpu ticks
    379256851 idle cpu ticks
        31778 IO-wait cpu ticks
            7 IRQ cpu ticks
         4073 softirq cpu ticks
            0 stolen cpu ticks
     17023816 pages paged in
     21544483 pages paged out
            0 pages swapped in
            0 pages swapped out
     78935690 interrupts
    143253821 CPU context switches
   1435457229 boot time
        61294 forks

7.slabの使用状況を確認する

「-m」オプションを使用することで、メモリのslabの(slabinfo)情報について出力させることができる。

vmstat -m

20150720_000013

[root@test-centos7 ~]# vmstat -m -n
Cache                       Num  Total   Size  Pages
ccid2_hc_tx_sock              0      0   1280     12
xfs_dqtrx                     0      0    576     14
xfs_icr                       0      0    144     28
xfs_ili                    3855   4004    152     26
xfs_inode                  9888   9888   1024     16
xfs_efd_item                160    220    400     20
xfs_da_state                 32     32    488     16
xfs_btree_cur                38     38    208     19
xfs_log_ticket              396    396    184     22
scsi_cmd_cache              324    324    448     18
kcopyd_job                    0      0   3312      9
dm_uevent                     0      0   2608     12
dm_rq_target_io               0      0    424     19
UDPLITEv6                     0      0   1152     14
UDPv6                        28     28   1152     14
tw_sock_TCPv6                32     32    256     16
TCPv6                        48     48   2048     16
cfq_queue                   374    442    232     17
bsg_cmd                       0      0    312     13
mqueue_inode_cache           18     18    896     18
hugetlbfs_inode_cache        26     26    608     13
configfs_dir_cache           92     92     88     46
dquot                         0      0    256     16
pid_namespace                 0      0   2176     15
posix_timers_cache            0      0    248     16
UDP-Lite                      0      0   1024     16
ip_fib_trie                  73     73     56     73
RAW                         187    187    960     17
UDP                          32     32   1024     16
tw_sock_TCP                  32     32    256     16
TCP                          34     34   1920     17
blkdev_queue                 34     34   1920     17
blkdev_requests            1218   1218    384     21
blkdev_ioc                   78     78    104     39
fsnotify_event_holder    121210 121210     24    170
fsnotify_event              476    476    120     34
sock_inode_cache            252    252    640     12
net_namespace                 0      0   4224      7
shmem_inode_cache           871    912    680     12
Acpi-ParseExt              5152   5152     72     56
Acpi-Namespace             4488   4488     40    102
taskstats                    24     24    328     12
proc_inode_cache           1224   1224    656     12
sigqueue                     50     50    160     25
bdev_cache                   38     38    832     19
sysfs_dir_cache           17364  17676    112     36
inode_cache               10999  12324    592     13
dentry                    44692  46599    192     21
iint_cache                    0      0     80     51
selinux_inode_security    23118  26571     80     51
buffer_head              158636 159120    104     39
vm_area_struct             8098   8280    216     18
mm_struct                    80     80   1600     20
files_cache                  96     96    640     12
signal_cache                150    210   1152     14
sighand_cache               158    165   2112     15
task_xstate                 167    266    832     19
task_struct                 181    209   2912     11
anon_vma                   4928   4928     64     64
shared_policy_node         2210   2210     48     85
numa_policy                  15     15    264     15
radix_tree_node           20739  22232    584     14
idr_layer_cache             165    165   2112     15
dma-kmalloc-8192              0      0   8192      4
dma-kmalloc-4096              0      0   4096      8
dma-kmalloc-2048              0      0   2048     16
dma-kmalloc-1024              0      0   1024     16
dma-kmalloc-512              16     16    512     16
dma-kmalloc-256               0      0    256     16
dma-kmalloc-128               0      0    128     32
dma-kmalloc-64                0      0     64     64
dma-kmalloc-32                0      0     32    128
dma-kmalloc-16                0      0     16    256
dma-kmalloc-8                 0      0      8    512
dma-kmalloc-192               0      0    192     21
dma-kmalloc-96                0      0     96     42
kmalloc-8192                 41     68   8192      4
kmalloc-4096                218    232   4096      8
kmalloc-2048                318    352   2048     16
kmalloc-1024               1219   1344   1024     16
kmalloc-512                 538    816    512     16
kmalloc-256                3230   3712    256     16
kmalloc-192                2243   2667    192     21
kmalloc-128                2238   3008    128     32
kmalloc-96                 4318   4872     96     42
kmalloc-64                37954  39808     64     64
kmalloc-32               165515 167296     32    128
kmalloc-16                50944  50944     16    256
kmalloc-8                 83456  83456      8    512
kmem_cache_node             128    128     64     64
kmem_cache                   96     96    256     16

8.デバイス・パーティションの統計情報を出力させる

vmstatでは、「-d」オプションでデバイスごとの統計情報を出力させることができる。

vmstat -d

20150720_000014

[root@test-centos7 ~]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
fd0        2      0      16      85      0      0       0       0      0      0
sda   103345    837 34047617 1035927 500440  22513 43093959 6204752      0    862
sr0        0      0       0       0      0      0       0       0      0      0
dm-0     246      0    1968     721      0      0       0       0      0      0
dm-1  102522      0 34001881 1039381 521883      0 43089569 7236979      0    864

それぞれの項目の意味を、以下に記述する。

reads/writes

  • total … 読み込み/書き込みに成功した総数
  • merged … グループ化した読み込み/書き込みの数
  • sectors … 読み込み/書き込みに成功したセクタ数
  • ms … 読み込み/書き込みに使用した時間(ミリ秒)

この項目の値は起動時からの計測なので、リアルタイムでの性能計測には不向きなので注意。

IO

  • cur … 実行中のIO
  • s … IOに使用した時間(秒)

 

残念ながら各デバイスごとに出力を絞る機能はついていないため、必要であればgrepと組み合わせると良いだろう。

vmstat -nd 実行間隔(秒) | grep -e ^disk- -e デバイス名

20150720_000018

 

なお、「-D」オプションを使用することで、全てのデバイスを統計してのステータスを表示させることもできる。

vmstat -D

20150720_000019

[root@test-centos7 ~]# vmstat -D
            5 disks
            2 partitions
       206117 total reads
          837 merged reads
     68051546 read sectors
      2076216 milli reading
      1030952 writes
        22626 merged writes
     86263314 written sectors
     13458654 milli writing
            0 inprogress IO
         1730 milli spent IO

 

パーティションごとのIO値を取得する場合は、「-p」オプションを用いる。

vmstat -p 対象パーティション(デバイスファイル)

20150720_000022

[root@test-centos7 ~]# vmstat -p /dev/sda2
sda2          reads   read sectors  writes    requested writes
              101975   34004905     503730   43130448
[root@test-centos7 ~]# vmstat -p /dev/sda2 1
sda2          reads   read sectors  writes    requested writes
              101975   34004905     503730   43130448
              101975   34004905     503735   43130494
              101975   34004905     503735   43130494
              101975   34004905     503735   43130494
              101975   34004905     503735   43130494
              101975   34004905     503735   43130494
              101975   34004905     503735   43130494
              101975   34004905     503735   43130494
              101975   34004905     503735   43130494
              101975   34004905     503735   43130494

それぞれの項目の意味は以下。

  • 指定したパーティションからの読み込み数
  • 指定したパーティションから読み出されたセクターの数
  • 指定したパーティションへの書き込み数
  • 指定したパーティションへの書き込み要求数

9.横に広く表示させる

パフォーマンス情報を出力させる際、ちょっと見にくいなと思ったら、「-w」オプションで横に広く表示させる事ができる。

vmstat -w

20150720_000023

[root@test-centos7 ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0  96364    128 1365472    0    0     4     6   10    4  0  0 100  0  0
[root@test-centos7 ~]#
[root@test-centos7 ~]# vmstat -w
procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
 r  b         swpd         free         buff        cache   si   so    bi    bo   in   cs  us  sy  id  wa  st
 1  0            0        96364          128      1365472    0    0     4     6   10    4   0   0 100   0   0

 

絵で見てわかるシステムパフォーマンスの仕組み 絵で見てわかるシステムパフォーマンスの仕組み

tailコマンドで覚えておきたい使い方4個

$
0
0

ログを監視する際によく利用するtailコマンド。
以外と、普通に実行するのと「-F」でのリアルタイムでのログ監視以外はあまり知られてないのではなかろうか。

今回は、そんなtailコマンドで覚えているとちょっと役に立つ使い方を紹介する。

1.基本的な使い方

基本的には、以下のようにコマンドを実行することで指定したファイルの末尾から行(デフォルトでは10行)を抽出して表示してくれる。

tail ファイルPATH

20150720_000024

[root@test-centos7 ~]# tail /var/log/messages
Jul 20 18:59:15 test-centos7 root: aaa
Jul 20 19:00:01 test-centos7 systemd: Starting Session 562 of user root.
Jul 20 19:00:01 test-centos7 systemd: Started Session 562 of user root.
Jul 20 19:01:01 test-centos7 systemd: Starting Session 563 of user root.
Jul 20 19:01:01 test-centos7 systemd: Started Session 563 of user root.
Jul 20 19:07:43 test-centos7 systemd-logind: Removed session 561.
Jul 20 19:07:46 test-centos7 systemd-logind: New session 564 of user root.
Jul 20 19:07:46 test-centos7 systemd: Starting Session 564 of user root.
Jul 20 19:07:46 test-centos7 systemd: Started Session 564 of user root.
Jul 20 19:07:53 test-centos7 systemd-logind: Removed session 564.

2.出力される行数を指定する

tailコマンドでデフォルトで表示される行数は10行だが、それを指定することができる。

tail -行数 ファイルPATH

20150720_000025

[root@test-centos7 ~]# tail /var/log/messages
Jul 20 19:07:53 test-centos7 systemd-logind: Removed session 564.
Jul 20 19:10:01 test-centos7 systemd: Starting Session 565 of user root.
Jul 20 19:10:01 test-centos7 systemd: Started Session 565 of user root.
Jul 20 19:10:01 test-centos7 systemd: Failed to mark scope session-565.scope as abandoned : Stale file handle
Jul 20 19:16:03 test-centos7 systemd-logind: New session 566 of user root.
Jul 20 19:16:03 test-centos7 systemd: Starting Session 566 of user root.
Jul 20 19:16:03 test-centos7 systemd: Started Session 566 of user root.
Jul 20 19:16:07 test-centos7 root: aaa
Jul 20 19:16:09 test-centos7 root: aaa
Jul 20 19:16:10 test-centos7 root: aaa
[root@test-centos7 ~]# tail -5 /var/log/messages
Jul 20 19:16:03 test-centos7 systemd: Starting Session 566 of user root.
Jul 20 19:16:03 test-centos7 systemd: Started Session 566 of user root.
Jul 20 19:16:07 test-centos7 root: aaa
Jul 20 19:16:09 test-centos7 root: aaa
Jul 20 19:16:10 test-centos7 root: aaa

3.追記された行を自動的に表示させていく

これはよく利用される機能だと思う。
「-F(-fでも動作的には同じ)」を指定することで、ファイルに追記されると同時にコンソール上でも表示してくれる。

tail -F ファイルPATH

20150720_000001

 

特定の文字列を含む行のみを出力させたい場合は、grepと組み合わせて利用すると良いだろう。

tail -F ファイルPATH | grep 抽出条件

20150720_000002

 

なお、特定のプロセスが終了した場合、監視を終了させることもできる。

tail -F ファイルPATH --pid=対象のプロセスのpid

 

4.複数のファイルを同時に表示させる

tailコマンドでは、複数のファイルを指定することでそれらを同時に表示させることができる。

tail ファイルPATH1 ファイルPATH2 ...

20150720_000004

 

「-F」と組み合わせて使用することもできる。
その場合、追記があった場合は以下のように出力される。

20150720_000005

 

同じファイルを見ているかのようにする(ヘッダーにファイル名を出力させないようにする)場合は、「-q」オプションと組み合わせて使用すると良いだろう。

tail -Fq ファイルPATH1 ファイルPATH2 ...

20150720_000006

 

新しいLinuxの教科書 新しいLinuxの教科書

dfで使用容量がフルじゃないのにディスクの空き容量が0の時の対応

$
0
0

Linuxで容量ギリギリでディスクを使用していると、時折以下のようにディスクの空き容量がまだあるはずなのに0として扱われてしまう事がある。

[root@recserver ~]# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/vg_recserver-lv_root
                       50G  3.5G   44G   8% /
tmpfs                 3.7G     0  3.7G   0% /dev/shm
/dev/sdb1             485M   91M  369M  20% /boot
/dev/mapper/vg_recserver-lv_home
                      400G  216M  379G   1% /home
/dev/sda              2.7T  2.6T     0 100% /media/data1
/dev/sdc1             2.7T  2.3T  308G  89% /media/data2
[root@recserver ~]# df
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/vg_recserver-lv_root
                      51606140   3566240  45418460   8% /
tmpfs                  3873168         0   3873168   0% /dev/shm
/dev/sdb1               495844     92601    377643  20% /boot
/dev/mapper/vg_recserver-lv_home
                     418786032    221144 397291700   1% /home
/dev/sda             2884285104 2746593496         0 100% /media/data1
/dev/sdc1            2884285068 2415734252 322037492  89% /media/data2

もちろん、特にファイルを削除しているわけではないので、プロセスがファイルを掴んでいるわけではない。
そんなときは、以下のコマンドでファイルシステムの予約ブロックサイズを確認すると良いだろう。もしこの予約ブロックの容量が大きい場合、そのせいで100%になってしまっている可能性がある。

tune2fs -l デバイスファイル
[root@recserver ~]# tune2fs -l /dev/sda
tune2fs 1.41.12 (17-May-2010)
Filesystem volume name:   data
Last mounted on:          /media/data1
Filesystem UUID:          f4af203d-dfda-4135-b9e2-b81f728d4463
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              183148544
Block count:              732566646
Reserved block count:     36628332
Free blocks:              34422902
Free inodes:              183147718
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      849
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
RAID stride:              1
Flex block group size:    16
Filesystem created:       Sun Sep  2 00:25:35 2012
Last mount time:          Thu Jul 23 03:01:33 2015
Last write time:          Thu Jul 23 03:01:33 2015
Mount count:              44
Maximum mount count:      39
Last checked:             Sat Feb  8 00:40:06 2014
Check interval:           15552000 (6 months)
Next check after:         Thu Aug  7 00:40:06 2014
Lifetime writes:          36 TB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      b3fd5ff4-2b9a-4ed3-b960-ce27765b2280
Journal backup:           inode blocks

 

この予約ブロックの%を変える場合は、以下のようにコマンドを実行する。

tune2fs -m 予約ブロックのデバイスファイル全体での割合(%) デバイスファイル
[root@recserver ~]# tune2fs -m 1 /dev/sda
tune2fs 1.41.12 (17-May-2010)
Setting reserved blocks percentage to 1% (7325666 blocks)
[root@recserver ~]# tune2fs -l /dev/sda
tune2fs 1.41.12 (17-May-2010)
Filesystem volume name:   data
Last mounted on:          /media/data1
Filesystem UUID:          f4af203d-dfda-4135-b9e2-b81f728d4463
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              183148544
Block count:              732566646
Reserved block count:     7325666
Free blocks:              34422902
Free inodes:              183147718
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      849
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
RAID stride:              1
Flex block group size:    16
Filesystem created:       Sun Sep  2 00:25:35 2012
Last mount time:          Thu Jul 23 03:01:33 2015
Last write time:          Thu Jul 23 07:46:04 2015
Mount count:              44
Maximum mount count:      39
Last checked:             Sat Feb  8 00:40:06 2014
Check interval:           15552000 (6 months)
Next check after:         Thu Aug  7 00:40:06 2014
Lifetime writes:          36 TB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      b3fd5ff4-2b9a-4ed3-b960-ce27765b2280
Journal backup:           inode blocks
[root@recserver ~]# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/vg_recserver-lv_root
                       50G  3.5G   44G   8% /
tmpfs                 3.7G     0  3.7G   0% /dev/shm
/dev/sdb1             485M   91M  369M  20% /boot
/dev/mapper/vg_recserver-lv_home
                      400G  216M  379G   1% /home
/dev/sda              2.7T  2.6T  104G  97% /media/data1
/dev/sdc1             2.7T  2.3T  308G  89% /media/data2

 

もし、lsofなどでプロセスをファイルがつかんでいなければ、これを疑うのが良いだろう。

IT技術者なら知っておきたい ストレージの原則と技術 IT技術者なら知っておきたい ストレージの原則と技術

pacoからporgへアップグレードし、管理データの引き継ぎを行う

$
0
0

以前、ソースからインストールしたパッケージの管理ツール『porg』を紹介したが、今回はこれの前身である『paco』から『porg』へのパッケージの管理情報の移行手順について記述していく。

まず、すでに環境内にはpacoがインストール済で、管理しているパッケージがある状態とする。

20150724_000000

 

まずは、事前にporgをインストールする必要がある。
インストール手順についてはこちらを参照してもらいたい。

porgのインストール完了後、以下のコマンドを実行することでpacoのパッケージ情報をporgに移行させる。

paco2porg

20150724_000001

[root@test-centos7 porg-0.2]# paco -a
cv  paco-2.0.9
[root@test-centos7 porg-0.2]# porg -a
porg-0.2
[root@test-centos7 porg-0.2]# paco2porg
[root@test-centos7 porg-0.2]# porg -a
cv
paco-2.0.9
porg-0.2

pacoが不要になったのであれば、以下のコマンドでporgから削除する。

porg -r paco-2.0.9

20150724_000003

[root@test-centos7 porg-0.2]# paco -a
cv  paco-2.0.9
[root@test-centos7 porg-0.2]# porg -a
cv
paco-2.0.9
porg-0.2
[root@test-centos7 porg-0.2]# porg -r paco-2.0.9
Remove package 'paco-2.0.9' (y/N) ? y
[root@test-centos7 porg-0.2]# porg -a
cv
porg-0.2
[root@test-centos7 porg-0.2]# paco -a
-bash: /usr/local/bin/paco: そのようなファイルやディレクトリはありません

 

新しいLinuxの教科書 新しいLinuxの教科書

nohupでバックグラウンドジョブ化したコマンドの終了時間を標準出力でファイルに書き出す

$
0
0

コマンドの実行時間を計測する際によく使用されるtimeコマンドだが、これはbashの組み込みコマンドのため、外部ファイルへの書き出しができない。

20150725_000000

 

こうなると、nohupなどでコマンドの実行時間をログに記録させて放置したくても、ファイルに書き出せないため放置することが難しくなる。
そんな時は、bashの組み込みコマンドとしてのtimeではなく、GNU timeを利用するといいだろう。

GNU timeは、それぞれのディストリビューションのパッケージ管理ソフトからインストールする。

●Debian/Ubuntuの場合

apt-get install time

 

●RHEL系の場合

yum install time

後は、以下のようにコマンドを実行する事でコマンドの実行時間を計測、その内容をログに書き出す事ができる。

/usr/bin/time -ao 計測時間を出力するファイル 実行するコマンド

20150725_000002

[root@test-centos7 ~]# time cp -fv aaa bbb1 > time

real    0m0.005s
user    0m0.002s
sys     0m0.003s
[root@test-centos7 ~]# cat time
`aaa' -> `bbb1'
[root@test-centos7 ~]# /usr/bin/time -ao time cp -fv aaa bbb2 > time
[root@test-centos7 ~]# cat time
`aaa' -> `bbb2'
0.00user 0.00system 0:00.00elapsed 66%CPU (0avgtext+0avgdata 1172maxresident)k
0inputs+8outputs (0major+351minor)pagefaults 0swaps

 

「elapsed」という箇所が実行に要した時間となる。

Linuxコンテナー最新ツール Dockerを支える技術(日経BP Next ICT選書) 日経Linux技術解説書 Linuxコンテナー最新ツール Dockerを支える技術(日経BP Next ICT選書) 日経Linux技術解説書

xargsコマンドで覚えておきたい使い方・組み合わせ7個

$
0
0

LinuxやUNIXで、コマンドちょっと組み合わせて利用する際、非常に役に立つxargsコマンド。
今回は、このxargsコマンドで覚えておきたい使い方・組み合わせについて紹介する。

1.基本的な使い方

まず、そもそもこのコマンドはどういう使い方をするのか。
基本的には、以下のようにパイプでつなぐことで前のコマンド(コマンド1)で取得した値(標準出力)を利用してxargsで指定した別のコマンド(コマンド2)に引数として渡して実行させる事ができるコマンドだ。

コマンド1 | xargs コマンド2

20150725_000003

[root@test-centos7 ~]# find /work -type f
/work/test2.txt
/work/test.txt
/work/aaaaa.txt
/work/bbbbb.txt
/work/ccccc.txt
/work/ddddd.txt
/work/sample
/work/test.image
/work/test1
/work/test2
/work/aaaaa2.txt
/work/aaaaa3.txt
/work/ln_aaaaa2.txt
[root@test-centos7 ~]# find /work -type f | xargs ls
/work/aaaaa.txt   /work/ccccc.txt      /work/test.image  /work/test2.txt
/work/aaaaa2.txt  /work/ddddd.txt      /work/test.txt
/work/aaaaa3.txt  /work/ln_aaaaa2.txt  /work/test1
/work/bbbbb.txt   /work/sample         /work/test2

2.実行されるコマンド内容を表示させる

xargsで指定されたコマンドの実行内容を表示させるには、「-t」オプションを付与する。

コマンド1 | xargs -t コマンド2

20150725_000004

[root@test-centos7 ~]# find /work -type f | xargs ls
/work/aaaaa.txt   /work/ccccc.txt      /work/test.image  /work/test2.txt
/work/aaaaa2.txt  /work/ddddd.txt      /work/test.txt
/work/aaaaa3.txt  /work/ln_aaaaa2.txt  /work/test1
/work/bbbbb.txt   /work/sample         /work/test2
[root@test-centos7 ~]# find /work -type f | xargs -t ls
ls /work/test2.txt /work/test.txt /work/aaaaa.txt /work/bbbbb.txt /work/ccccc.txt /work/ddddd.txt /work/sample /work/test.image /work/test1 /work/test2 /work/aaaaa2.txt /work/aaaaa3.txt /work/ln_aaaaa2.txt
/work/aaaaa.txt   /work/ccccc.txt      /work/test.image  /work/test2.txt
/work/aaaaa2.txt  /work/ddddd.txt      /work/test.txt
/work/aaaaa3.txt  /work/ln_aaaaa2.txt  /work/test1
/work/bbbbb.txt   /work/sample         /work/test2

これで、xargsで実行されているコマンドがどういった形になっているかを確認することができる。

なお、この実行コマンドは標準エラー出力となっているため、実行コマンドのみ「test.cmd」、コマンドの実行結果のみ「test.lst」に出力させるといった事も可能だ。

20150726_000003

[root@test-centos7 ~]# find /work -type f | xargs -t ls
ls /work/test2.txt /work/test.txt /work/aaaaa.txt /work/bbbbb.txt /work/ccccc.txt /work/ddddd.txt /work/sample /work/test.image /work/test1 /work/test2 /work/aaaaa2.txt /work/aaaaa3.txt /work/ln_aaaaa2.txt
/work/aaaaa.txt   /work/bbbbb.txt  /work/ln_aaaaa2.txt  /work/test.txt  /work/test2.txt
/work/aaaaa2.txt  /work/ccccc.txt  /work/sample         /work/test1
/work/aaaaa3.txt  /work/ddddd.txt  /work/test.image     /work/test2
[root@test-centos7 ~]# find /work -type f | xargs -t ls > test.lst 2>test.cmd
[root@test-centos7 ~]# cat test.lst
/work/aaaaa.txt
/work/aaaaa2.txt
/work/aaaaa3.txt
/work/bbbbb.txt
/work/ccccc.txt
/work/ddddd.txt
/work/ln_aaaaa2.txt
/work/sample
/work/test.image
/work/test.txt
/work/test1
/work/test2
/work/test2.txt
[root@test-centos7 ~]# cat test.cmd
ls /work/test2.txt /work/test.txt /work/aaaaa.txt /work/bbbbb.txt /work/ccccc.txt /work/ddddd.txt /work/sample /work/test.image /work/test1 /work/test2 /work/aaaaa2.txt /work/aaaaa3.txt /work/ln_aaaaa2.txt

3.コマンドライン一行に引数をいくつ渡すか指定する

「-n」オプションを指定することで、xargsで実行するコマンド一行にいくつまで引数を渡すのか指定することができる。

コマンド1 | xargs -n 引数の数 コマンド2

20150726_000000

[root@test-centos7 ~]# find /work -type f | xargs -t ls
ls /work/test2.txt /work/test.txt /work/aaaaa.txt /work/bbbbb.txt /work/ccccc.txt /work/ddddd.txt /work/sample /work/test.image /work/test1 /work/test2 /work/aaaaa2.txt /work/aaaaa3.txt /work/ln_aaaaa2.txt
/work/aaaaa.txt   /work/ccccc.txt      /work/test.image  /work/test2.txt
/work/aaaaa2.txt  /work/ddddd.txt      /work/test.txt
/work/aaaaa3.txt  /work/ln_aaaaa2.txt  /work/test1
/work/bbbbb.txt   /work/sample         /work/test2
[root@test-centos7 ~]# find /work -type f | xargs -t -n 2 ls
ls /work/test2.txt /work/test.txt
/work/test.txt  /work/test2.txt
ls /work/aaaaa.txt /work/bbbbb.txt
/work/aaaaa.txt  /work/bbbbb.txt
ls /work/ccccc.txt /work/ddddd.txt
/work/ccccc.txt  /work/ddddd.txt
ls /work/sample /work/test.image
/work/sample  /work/test.image
ls /work/test1 /work/test2
/work/test1  /work/test2
ls /work/aaaaa2.txt /work/aaaaa3.txt
/work/aaaaa2.txt  /work/aaaaa3.txt
ls /work/ln_aaaaa2.txt
/work/ln_aaaaa2.txt

 

上記例のように、「-n」で指定しない場合はすべての引数がxargsで実行されるコマンドに渡される。
一行づつ処理を指せるならば、「-n」オプションで引数を指定してあげると良いだろう。

4.引数の値を明示的に利用する

通常、ただxargsでコマンドを指定した場合、渡された引数はそのまま処理されるが、例えばファイル名の末尾に何か文字列を付け加えたりしたい事もあるだろう。
そんなときは、「-I」オプションを使用し、コマンドで引数を明示的に使用すればいい。通常は、「{}」で引数の使用を表している。

コマンド1 | xargs -I{} コマンド2 {}

 

例えば「/work」フォルダ配下にあるファイルに対し、元のファイル名の後ろに「.bk」という文字列を付け足してコピーする場合、以下のようにする。

find /work -type f | xargs -t -I{} cp {} {}.bk

20150726_000002

[root@test-centos7 ~]# find /work -type f | xargs -t -I{} cp {} {}.bk
cp /work/test2.txt /work/test2.txt.bk
cp /work/test.txt /work/test.txt.bk
cp /work/aaaaa.txt /work/aaaaa.txt.bk
cp /work/bbbbb.txt /work/bbbbb.txt.bk
cp /work/ccccc.txt /work/ccccc.txt.bk
cp /work/ddddd.txt /work/ddddd.txt.bk
cp /work/sample /work/sample.bk
cp /work/test.image /work/test.image.bk
cp /work/test1 /work/test1.bk
cp /work/test2 /work/test2.bk
cp /work/aaaaa2.txt /work/aaaaa2.txt.bk
cp /work/aaaaa3.txt /work/aaaaa3.txt.bk
cp /work/ln_aaaaa2.txt /work/ln_aaaaa2.txt.bk

5.コマンドの実行をするかどうか質問させる

「-p」オプションを使用する事で、xargsで生成したコマンドを本当に実行するかどうかを確認させる事が出来る。

コマンド1 | xargs -p コマンド2

20150726_000009

[root@test-centos7 ~]# find /work -type f -name "*.bk" | xargs -p -n 1 rm
rm /work/test2.txt.bk ?...y
rm /work/test.txt.bk ?...y
rm /work/aaaaa.txt.bk ?...y
rm /work/bbbbb.txt.bk ?...y
rm /work/ccccc.txt.bk ?...y
rm /work/ddddd.txt.bk ?...y
rm /work/sample.bk ?...y
rm /work/test.image.bk ?...y
rm /work/test1.bk ?...y
rm /work/test2.bk ?...y
rm /work/aaaaa2.txt.bk ?...y
rm /work/aaaaa3.txt.bk ?...y
rm /work/ln_aaaaa2.txt.bk ?...y

6.複数プロセスを同時に実行させる

xargsで実行させるコマンドを、複数のプロセスを同時に立ち上げて実行させる場合、「-P」オプションを利用する。

コマンド1 | xargs -P 最大プロセス数 コマンド2

20150726_000010

7.引数の区切り文字を指定する

通常、xargsでコマンドに渡される引数はスペース区切りとなっているが、「-d」オプションを指定することでその区切り文字を変更することができる。

コマンド1 | xargs -d区切り文字 コマンド2

 

例えば、以下のようにコマンドを実行することで、カンマ区切りとして引数を渡す事ができる。

20150726_000011

[root@test-centos7 ~]# echo "a b c d e f" | xargs -t -n 1 echo
echo a
a
echo b
b
echo c
c
echo d
d
echo e
e
echo f
f
[root@test-centos7 ~]# echo "a b c,d e f" | xargs -t -n 1 -d, echo
echo a b c
a b c
echo d e f
d e f

番外編 ~findコマンドとの組み合わせ凡例~

xargsとよく組み合わせて利用されるfindコマンド。
このfindコマンドとの組み合わせで覚えておくと便利そうな判例を幾つか記述する。

特定のファイルのバックアップファイルを作成する

find PATH -type f -name 'ファイル名' | xargs -n 1 -I{} cp {} {}.bk

特定のファイルをバックアップディレクトリにコピーする

find PATH -type f -name 'ファイル名' | xargs -n 1 -I{} cp {} バックアップ先PATH

特定のファイルに対してのみgrepを行う

find PATH -type f -name 'ファイル名' | xargs -n 1 -I{} grep '検索キーワード' {}
シェルプログラミング実用テクニック シェルプログラミング実用テクニック

awkとxargs、evalを用いてcsv形式のファイルからchmod/chownを実行する

$
0
0

CSV形式で書かれているファイルにファイルPATH、オーナー、グループ、権限を書いておき、それを読みだしてワンライナーでchmod、chownを実行する方法を探していたが、とりあえず以下のようにすれば実現できることがわかった。

なお、ファイルの中身は以下のように書かれているとする。

[root@test-centos7 ~]# cat /root/test.lst
755,test,test,/work/aaaaa.txt
777,test,test,/work/aaaaa.txt.bk
666,test,test,/work/aaaaa2.txt
555,test,test,/work/aaaaa2.txt.bk
755,test,test,/work/aaaaa3.txt
775,test,test,/work/aaaaa3.txt.bk

1.chmodを実行する

CSVファイルの内容を元にchmodを実行する場合は、以下のようにコマンドを実行する。

awk -F, '{ print $1" " $4 }' /root/test.lst | xargs  -t -n 1 -d'\n' -I{} sh -c 'eval chmod {}'

20150726_000014

[root@test-centos7 ~]# awk -F, '{ print $1" " $4 }' /root/test.lst | xargs  -t -n 1 -d'\n' -I{} sh -c 'eval chmod {}'
sh -c eval chmod 755 /work/aaaaa.txt
sh -c eval chmod 777 /work/aaaaa.txt.bk
sh -c eval chmod 666 /work/aaaaa2.txt
sh -c eval chmod 555 /work/aaaaa2.txt.bk
sh -c eval chmod 755 /work/aaaaa3.txt
sh -c eval chmod 775 /work/aaaaa3.txt.bk
[root@test-centos7 ~]# ls -la /work/aaaaa*
-rwxr-xr-x. 1 test test 0  6月  6 12:14 /work/aaaaa.txt
-rwxrwxrwx. 1 test test 0  7月 26 11:28 /work/aaaaa.txt.bk
-rw-rw-rw-. 1 test test 0  7月 12 08:35 /work/aaaaa2.txt
-r-xr-xr-x. 1 test test 0  7月 26 11:28 /work/aaaaa2.txt.bk
-rwxr-xr-x. 1 test test 0  7月 11 19:31 /work/aaaaa3.txt
-rwxrwxr-x. 1 test test 0  7月 26 11:28 /work/aaaaa3.txt.bk

2.chownを実行する

同じく、CSVファイルの情報を元にchownを実行する場合は、以下のようにコマンドを実行する。

awk -F, '{ print $2":"$3" " $4 }' /root/test.lst | xargs  -t -n 1 -d'\n' -I{} sh -c 'eval chown {}'

20150726_000017

[root@test-centos7 ~]# awk -F, '{ print $2":"$3" " $4 }' /root/test.lst | xargs  -t -n 1 -d'\n' -I{} sh -c 'eval chown {}'
sh -c eval chown test:test /work/aaaaa.txt
sh -c eval chown test:test /work/aaaaa.txt.bk
sh -c eval chown root:root /work/aaaaa2.txt
sh -c eval chown apache:apache /work/aaaaa2.txt.bk
sh -c eval chown test:test /work/aaaaa3.txt
sh -c eval chown test:test /work/aaaaa3.txt.bk
[root@test-centos7 ~]# ls -la /work/aaaaa*
-rwxr-xr-x. 1 test   test   0  6月  6 12:14 /work/aaaaa.txt
-rwxrwxrwx. 1 test   test   0  7月 26 11:28 /work/aaaaa.txt.bk
-rw-rw-rw-. 1 root   root   0  7月 12 08:35 /work/aaaaa2.txt
-r-xr-xr-x. 1 apache apache 0  7月 26 11:28 /work/aaaaa2.txt.bk
-rwxr-xr-x. 1 test   test   0  7月 11 19:31 /work/aaaaa3.txt
-rwxrwxr-x. 1 test   test   0  7月 26 11:28 /work/aaaaa3.txt.bk

awkだけでも実現できそうな気もするけど…
とりあえず、当座はこれでいいかなぁ。

AWK実践入門 AWK実践入門

cpコマンドでディレクトリ構造を含めてコピーする

$
0
0

オプション無しだと、cpコマンドではディレクトリ構造ごと(サブディレクトリを含めた状態で)コピーすることはできない。
もしディレクトリ構造とセットでコピーしたい場合は、「–parents」オプションを利用すると良いだろう。

cp --parents コピー元ファイル コピー先PATH

20150729_000000

[root@test-centos7 ~]# cp /work/aaaaa.txt /bkup
[root@test-centos7 ~]# ls -la /bkup
合計 4
drwxr-xr-x.  2 root root   22  7月 29 05:49 .
drwxr-xr-x. 30 root root 4096  7月 29 05:48 ..
-rwxr-xr-x.  1 root root    0  7月 29 05:49 aaaaa.txt
[root@test-centos7 ~]# cp --parents /work/aaaaa.txt /bkup
[root@test-centos7 ~]# ls -la /bkup
合計 4
drwxr-xr-x.  3 root root   33  7月 29 05:49 .
drwxr-xr-x. 30 root root 4096  7月 29 05:48 ..
-rwxr-xr-x.  1 root root    0  7月 29 05:49 aaaaa.txt
drwxr-xr-x.  2 root root   22  7月 29 05:49 work
[root@test-centos7 ~]# ls -la /bkup/work
合計 0
drwxr-xr-x. 2 root root 22  7月 29 05:49 .
drwxr-xr-x. 3 root root 33  7月 29 05:49 ..
-rwxr-xr-x. 1 root root  0  7月 29 05:49 aaaaa.txt
すべてのUNIXで20年動くプログラムはどう書くべきか デプロイ・保守に苦しむエンジニア達へ贈る[シェルスクリプトレシピ集] すべてのUNIXで20年動くプログラムはどう書くべきか デプロイ・保守に苦しむエンジニア達へ贈る[シェルスクリプトレシピ集]

sedコマンドで覚えておきたい使い方12個

$
0
0

LinuxやUNIXを使う上で、ある程度使えると非常に便利な置換コマンドが、このsedコマンドだ。
今回は、このsedコマンドで覚えておきたい使い方について紹介する。

なお、今回の置換・編集の例として、以下のファイルを用いて説明する。

[root@test-centos7 work]# cat /root/sed_test.conf
# line 1
line1=enable
# line 2
line2=disable

# line 3
line3=enable
# line 4
line4=enable

1.基本的な使い方

sedコマンドの基本的な使い方としては、以下のようにコマンドを実行することでファイル・標準出力の内容で文字列の置換を行う事だ。
なお、条件の最後に「g」を付けないと、”最初に、マッチした箇所のみ”置換するので注意。

●ファイルの内容を置換する場合

sed 's/置換前文字列/置換後文字列/g' ファイルPATH

20150729_000000

[root@test-centos7 work]# sed 's/line/gyou/g' /root/sed_test.conf
# gyou 1
gyou1=enable
# gyou 2
gyou2=disable

# gyou 3
gyou3=enable
# gyou 4
gyou4=enable

●標準出力の内容を置換する場合

コマンド | sed 's/置換前文字列/置換後文字列/g'

20150729_000001

[root@test-centos7 work]# cat /root/sed_test.conf | sed 's/line/gyou/g'
# gyou 1
gyou1=enable
# gyou 2
gyou2=disable

# gyou 3
gyou3=enable
# gyou 4
gyou4=enable

指定出来る処理内容は、以下のように非常に多い。
多いので、その中でもよく利用する処理について、個別に説明することにする。

●コメント

  • # … #移行はコメントとして取り扱う

●置換

  • c … 行をまるごと置換する
  • s … 文字列を置換する

●追加・挿入

  • a … 行を”追加”する
  • i … 行を”挿入”する

なお、複数行追加・挿入する場合は「\n」で改行を表現する。

●削除

  • d … 行を削除する
  • D … 先頭セグメントから最初の改行までを削除する

●入力

  • r ファイル名 … ファイルの内容を読み込む
  • n … パターンスペースを入力の次の行で置換
  • N … 入力の次の行をパターンスペースに追加し,改行文字を埋め込む(‘\n’ で改行として認識されるのはここで埋め込まれた改行文字だけとなる)

 ●出力

  • p … パターンスペースを標準出力に出力
  • P … パターンスペースの先頭セグメントから最初の改行までを標準出力に出力
  • | … 明白な形式でパターンスペースを標準出力に一覧表示する
  • = … 現在の行番号を 1 行として標準出力に出力(タブ文字などは対応するエスケープシーケンスとして表示され,非印字文字は 8 進数表記法で表示される)
  • w ファイル名 … ファイルにパターンスペースを追加する。w コマンドが最初に呼び出されたときにはファイルの中身はクリアされる

●ホールドスペースの利用

  • g … パターンスペースの内容をホールドスペースの内容で置換
  • G … ホールドスペースの内容をパターンスペースに追加
  • h … ホールドスペースの内容をパターンスペースの内容で置換
  • H … パターンスペースの内容をホールドスペースに追加
  • x … パターンスペースの内容とホールドスペースの内容を交換する

●グループ化

  • {コマンドリスト}

●制御構造

  • b ラベル … 指定したラベルの : コマンドに分岐
  • t ラベル … 入力行の最新の読みとりまたは t の実行以降に代入が行われている場合,指定したラベルの : コマンドに分岐
  • : ラベル … ラベル付け
  • q … 終了

なお、上記内容はこちらから引用させて頂いた。
感謝!

2.文字列を置換する

sedの基本。以下のようにコマンドを実行することで、特定の行の文字列を置換する事もできる。

●○行目にある特定の文字列を置換する場合

sed '○s/置換前文字列/置換後文字列/g'

20150729_000002

[root@test-centos7 work]# sed '4s/line/gyou/g' /root/sed_test.conf
# line 1
line1=enable
# line 2
gyou2=disable

# line 3
line3=enable
# line 4
line4=enable

●◯行目~◯行目にある特定の文字列を置換する場合

○行目~○行目までを置換する場合は、以下のように開始行と終了行をカンマで区切って記述してやると良い。

sed '○,○s/置換前文字列/置換後文字列/g'

20150729_000004

[root@test-centos7 work]# sed '4,8s/line/gyou/g' /root/sed_test.conf
# line 1
line1=enable
# line 2
gyou2=disable

# gyou 3
gyou3=enable
# gyou 4
line4=enable

●特定の文字列を含む行のみ置換する場合

特定の文字列(正規表現可)を含む行に対してのみ、置換することも出来る。

sed '/検索文字列/s/置換前文字列/置換後文字列/g'

20150731_000001

[root@test-centos7 ~]# sed '/=/s/line/gyou/g' /root/sed_test.conf
# line 1
gyou1=enable
# line 2
gyou2=disable

# line 3
gyou3=enable
# line 4
gyou4=enable
[root@test-centos7 ~]# sed '/^line/s/line/gyou/g' /root/sed_test.conf
# line 1
gyou1=enable
# line 2
gyou2=disable

# line 3
gyou3=enable
# line 4
gyou4=enable

●その行に表示される◯番目の文字列を置換する

その行で、◯番目に表示された文字列に対して処理をする場合は、以下のようにコマンドを実行する。

sed 's/置換前文字列/置換後文字列/何文字目か'

20150731_000019

[root@test-centos7 ~]# cat /root/sed_test.conf
# line 1 line 2
line1=enable
# line 2
line2=disable

# line 3
line3=enable
# line 4
line4=enable
[root@test-centos7 ~]# sed 's/line/gyou/2' /root/sed_test.conf
# line 1 gyou 2
line1=enable
# line 2
line2=disable

# line 3
line3=enable
# line 4
line4=enable

3.行を挿入する

sedでは、特定の行に対して指定した行を挿入することもできる。
挿入の場合、実行する処理に応じて「i」と「a」を使い分ける。

●指定した行番号の箇所に行を挿入する

以下のようにコマンドを実行することで、◯行目に指定した行を挿入をすることが出来る。

sed '◯i 挿入する行'

20150731_000002

[root@test-centos7 ~]# cat /root/sed_test.conf
# line 1
line1=enable
# line 2
line2=disable

# line 3
line3=enable
# line 4
line4=enable
[root@test-centos7 ~]# sed '4i testline' /root/sed_test.conf
# line 1
line1=enable
# line 2
testline
line2=disable

# line 3
line3=enable
# line 4
line4=enable

●指定した行の後ろに行を挿入する

以下のようにコマンドを実行することで、◯行目の後ろに指定した行を挿入することが出来る。

sed '◯a 挿入する行'

20150731_000003

[root@test-centos7 ~]# cat /root/sed_test.conf
# line 1
line1=enable
# line 2
line2=disable

# line 3
line3=enable
# line 4
line4=enable
[root@test-centos7 ~]# sed '4a testline' /root/sed_test.conf
# line 1
line1=enable
# line 2
line2=disable
testline

# line 3
line3=enable
# line 4
line4=enable

●指定した複数の各行の前、後ろに行を挿入する

指定した行の範囲に対し、挿入を行う事も出来る。

sed '◯,◯i 挿入する行' #前に挿入する場合
sed '◯,◯a 挿入する行' #後に挿入する場合

20150731_000004

[root@test-centos7 ~]# sed '1,4i testline' /root/sed_test.conf
testline
# line 1
testline
line1=enable
testline
# line 2
testline
line2=disable

# line 3
line3=enable
# line 4
line4=enable
[root@test-centos7 ~]# sed '1,4a testline' /root/sed_test.conf
# line 1
testline
line1=enable
testline
# line 2
testline
line2=disable
testline

# line 3
line3=enable
# line 4
line4=enable

●指定したキーワードを持つ行の前・後に行を挿入する

キーワードを指定して、その行の前・後に行を挿入することも出来る。

sed '/キーワード/i 挿入する行' #前に挿入する場合
sed '/キーワード/a 挿入する行' #後に挿入する場合

20150731_000005

[root@test-centos7 ~]# cat /root/sed_test.conf
# line 1
line1=enable
# line 2
line2=disable

# line 3
line3=enable
# line 4
line4=enable
[root@test-centos7 ~]# sed '/line3/i testline' /root/sed_test.conf
# line 1
line1=enable
# line 2
line2=disable

# line 3
testline
line3=enable
# line 4
line4=enable
[root@test-centos7 ~]# sed '/line3/a testline' /root/sed_test.conf
# line 1
line1=enable
# line 2
line2=disable

# line 3
line3=enable
testline
# line 4
line4=enable

4.行を削除する

指定した行を削除して表示させることも出来る。

●◯行目を削除する

削除する行が◯行目と決まっている場合、以下のようにコマンドを実行する。

sed '◯d'

20150731_000006

[root@test-centos7 ~]# cat /root/sed_test.conf
# line 1
line1=enable
# line 2
line2=disable

# line 3
line3=enable
# line 4
line4=enable
[root@test-centos7 ~]# sed '4d' /root/sed_test.conf
# line 1
line1=enable
# line 2

# line 3
line3=enable
# line 4
line4=enable

●◯行目~◯行目を削除する

◯行目~◯行目を削除する場合は、以下のようにする。

sed '◯,◯d'

20150731_000007

[root@test-centos7 ~]# cat /root/sed_test.conf
# line 1
line1=enable
# line 2
line2=disable

# line 3
line3=enable
# line 4
line4=enable
[root@test-centos7 ~]# sed '1,4d' /root/sed_test.conf

# line 3
line3=enable
# line 4
line4=enable

●決まったキーワードを持つ行を除外する

特定のキーワードを持つ行を削除する場合は、以下のようにする。

sed '/キーワード/d'

20150731_000008

[root@test-centos7 ~]# cat /root/sed_test.conf
# line 1
line1=enable
# line 2
line2=disable

# line 3
line3=enable
# line 4
line4=enable
[root@test-centos7 ~]# sed '/line2/d' /root/sed_test.conf
# line 1
line1=enable
# line 2

# line 3
line3=enable
# line 4
line4=enable

5.行の内容を上書きする

指定した行の内容を置換ではなく、上書きすることも出来る。

●◯行目の内容を上書きする

以下のようにコマンドを実行することで、指定した行の内容を上書きして置き換える事が出来る。

sed '◯c 置き換え後の行'

20150731_000009

[root@test-centos7 ~]# cat /root/sed_test.conf
# line 1
line1=enable
# line 2
line2=disable

# line 3
line3=enable
# line 4
line4=enable
[root@test-centos7 ~]# sed '4c testline' /root/sed_test.conf
# line 1
line1=enable
# line 2
testline

# line 3
line3=enable
# line 4
line4=enable

●特定のキーワードを持つ行を上書きする

もちろん、特定のキーワードを持つ行を上書きすることも出来る。

sed '/キーワード/c 置き換え後の行'

20150731_000010

[root@test-centos7 ~]# cat /root/sed_test.conf
# line 1
line1=enable
# line 2
line2=disable

# line 3
line3=enable
# line 4
line4=enable
[root@test-centos7 ~]# sed '/line3/c testline' /root/sed_test.conf
# line 1
line1=enable
# line 2
line2=disable

# line 3
testline
# line 4
line4=enable

6.ファイルの内容を上書きする

sedで編集した内容をファイルに上書きしたい場合もあるだろう。
そんなときは、「-i」オプションを付与すると上書きをすることが出来る。

sed -i '置換条件' ファイルPATH

20150731_000013

[root@test-centos7 ~]# cat /root/sed_test.conf
# line 1
line1=enable
# line 2
line2=disable

# line 3
line3=enable
# line 4
line4=enable
[root@test-centos7 ~]# sed 's/line 1/line #/g' /root/sed_test.conf
# line #
line1=enable
# line 2
line2=disable

# line 3
line3=enable
# line 4
line4=enable
[root@test-centos7 ~]# sed -i 's/line 1/line #/g' /root/sed_test.conf
[root@test-centos7 ~]# cat /root/sed_test.conf
# line #
line1=enable
# line 2
line2=disable

# line 3
line3=enable
# line 4
line4=enable

 

保存時に直前の状態のバックアップを取得させることも出来る。

sed -i.バックアップファイルの末尾に付与する文字列 '置換条件' ファイルPATH

20150731_000014

[root@test-centos7 ~]# cat /root/sed_test.conf
# line #
line1=enable
# line 2
line2=disable

# line 3
line3=enable
# line 4
line4=enable
[root@test-centos7 ~]# sed -i.$(date +%Y%m%d) 's/line 2/line #/g' /root/sed_test.conf
[root@test-centos7 ~]# cat /root/sed_test.conf.20150731
# line #
line1=enable
# line 2
line2=disable

# line 3
line3=enable
# line 4
line4=enable
[root@test-centos7 ~]# cat /root/sed_test.conf
# line #
line1=enable
# line #
line2=disable

# line 3
line3=enable
# line 4
line4=enable

なお、このオプションはGNU拡張のコマンドじゃないと用意されていないので注意。
HP-UX等の場合だと使えないので、一度リダイレクトなどで別のファイルに書き出してから上書きすることをお勧めしたい。

7.複数の置換条件を適用する

複数の置換条件を使用する場合は、「-e」オプションでそれぞれの置換条件を指定してあげると良い。

sed -e '置換条件' -e '置換条件' ...

20150731_000015

[root@test-centos7 ~]# cat /root/sed_test.conf
# line 1
line1=enable
# line 2
line2=disable

# line 3
line3=enable
# line 4
line4=enable
[root@test-centos7 ~]# sed -e 's/line/gyou/g' -e '5c aaaaaaa' /root/sed_test.conf
# gyou 1
gyou1=enable
# gyou 2
gyou2=disable
aaaaaaa
# gyou 3
gyou3=enable
# gyou 4
gyou4=enable

8. ファイルに書いた置換条件を読み込む

「-f」オプションを使用することで、外部ファイルに記述した置換条件を読み込んで実行することが出来る。

sed -f スクリプトファイルPATH

20150731_000016

[root@test-centos7 ~]# cat /root/sed_test.conf
# line 1
line1=enable
# line 2
line2=disable

# line 3
line3=enable
# line 4
line4=enable
[root@test-centos7 ~]# cat /root/sed_script
s/line/gyou/g
5c aaaaaaa
[root@test-centos7 ~]# sed -f /root/sed_script /root/sed_test.conf
# gyou 1
gyou1=enable
# gyou 2
gyou2=disable
aaaaaaa
# gyou 3
gyou3=enable
# gyou 4
gyou4=enable

9.小文字/大文字の変換をする

GNU拡張版のsedであれば、以下のようにコマンドを実行することで小文字⇔大文字の変換を行う事が出来る。

●小文字→大文字の場合

sed 's/\(.*\)/\U\1/'

20150731_000017

[root@test-centos7 ~]# cat /root/sed_test.conf
# line 1
line1=enable
# line 2
line2=disable

# line 3
line3=enable
# line 4
line4=enable
[root@test-centos7 ~]# sed 's/\(.*\)/\U\1/' /root/sed_test.conf
# LINE 1
LINE1=ENABLE
# LINE 2
LINE2=DISABLE

# LINE 3
LINE3=ENABLE
# LINE 4
LINE4=ENABLE

●大文字→小文字の場合

sed 's/\(.*\)/\L\1/'

20150731_000018

[root@test-centos7 ~]# cat /root/sed_test.conf
# LINE 1
LINE1=ENABLE
# LINE 2
LINE2=DISABLE

# LINE 3
LINE3=ENABLE
# LINE 4
LINE4=ENABLE
[root@test-centos7 ~]# sed 's/\(.*\)/\L\1/' /root/sed_test.conf
# line 1
line1=enable
# line 2
line2=disable

# line 3
line3=enable
# line 4
line4=enable

 

もしPosix標準のsedしか使えない場合は、以下のようにコマンドを実行することで変換出来る。

sed "y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/" # 小文字→大文字の場合
sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/" # 大文字→小文字の場合

10.置換にコマンドの実行結果を利用する

sedでの置換にコマンドの実行結果を利用する場合は、処理を「'(シングルクォーテーション)」で囲わず、「”(ダブルクォーテーション)」か特に囲まないで、コマンドの実行箇所だけを「`(バッククォート)」で囲んで記述するといいだろう。

20150220_000000

$ cat test.hostname
hostname
HOSTNAME
TESTNAME
$
$ # シングルォーテーションだと、置換されない
$ sed -e 's/hostname/`hostname`/g' ./test.hostname
`hostname`
HOSTNAME
TESTNAME
$
$ # ダブルクォーテーションだと、置換される
$ sed -e "s/hostname/`hostname`/g" ./test.hostname
test-centos
HOSTNAME
TESTNAME
$
$ # 処理を囲まなくても置換される
$ sed -e s/hostname/`hostname`/g ./test.hostname
test-centos
HOSTNAME
TESTNAME
$

なお、sshコマンド経由でsedを実行させる場合は、sedコマンドの処理自体をシングルクォーテーションで括る必要があるので注意。

11.ダブルクォーテーション・シングルクォーテーションで囲まれた文字列に対して処理を行う

sedの使い方というよりも正規表現の書き方になりそうだが、ダブルクォーテーション・シングルクォーテーションで囲まれた文字列に対し処理を行う場合、以下のようにコマンドを実行する。

●ダブルクォーテーションの場合

sed 's/"\([^"]*\)"/"置換後の値"/' 対象のファイルPATH
[root@test-centos7 work]# cat /work/test.txt
testline1="test1"
testline2="test2"

testline3='test3'
testline4='test4'
[root@test-centos7 work]# sed 's/"\([^"]*\)"/"replace"/' /work/test.txt
testline1="replace"
testline2="replace"

testline3='test3'
testline4='test4'

●シングルクォーテーションの場合

sed 's/"\([^"]*\)"/"置換後の値"/' 対象のファイルPATH
[root@test-centos7 work]# cat /work/test.txt
testline1="test1"
testline2="test2"

testline3='test3'
testline4='test4'
[root@test-centos7 work]# sed "s/'\([^']*\)'/'replace'/" /work/test.txt
testline1="test1"
testline2="test2"

testline3='replace'
testline4='replace'

20150604_000000

12.ログから特定の時間帯の内容を抜き出す

以下のようにコマンドを実行することで、特定の時間帯のログを出力させることも出来る。

awk -F - '"開始時間" < $1 && $1 <= "終了時間"' /抽出を行うログのPATH

20150405_000002

 

パターン・使い道が多すぎて、とりあえず今回はこれだけ。
sedコマンドはまだまだ便利な方法がある(というか、多分こんな程度ではない…)、これからも勉強していかないとなぁ。。。

覚えて便利 いますぐ使える!シェルスクリプトシンプルレシピ54 覚えて便利 いますぐ使える!シェルスクリプトシンプルレシピ54

Linuxのlogrotateを手動実行させる

$
0
0

Linuxのlogrotateを手動実行する場合、ただ実行コマンド(“/usr/sbin/logrotate /etc/logrotate.conf”)を実行しただけではログローテーションは行われない。
手動でのローテーションを行う場合は、以下のファイルに記述されている各ログの日付を過去日付にしてあげる必要がある。

●Debian/Ubuntuの場合

「/var/lib/logrotate/status」というファイルに各ログで最後にログローテーションした日付が記述されている。

test@ubuntu-server:~$ cat /var/lib/logrotate/status
logrotate state -- version 2
"/var/log/syslog" 2015-7-24-6:25:2
"/var/log/dpkg.log" 2015-7-1-6:25:2
"/var/log/auth.log" 2015-7-19-6:25:3
"/var/log/apt/term.log" 2015-7-1-6:25:2
"/var/log/ppp-connect-errors" 2015-7-24-6:0:0
"/var/log/apt/history.log" 2015-7-1-6:25:2
"/var/log/alternatives.log" 2015-7-1-6:25:2
"/var/log/debug" 2015-7-24-6:0:0
"/var/log/mail.log" 2015-7-24-6:0:0
"/var/log/kern.log" 2015-7-13-6:25:2
"/var/log/aptitude" 2015-7-24-6:0:0
"/var/log/ufw.log" 2015-7-24-6:0:0
"/var/log/daemon.log" 2015-7-24-6:0:0
"/var/log/wtmp" 2015-7-1-6:25:2
"/var/log/mail.warn" 2015-7-24-6:0:0
"/var/log/btmp" 2015-7-1-6:25:2
"/var/log/lpr.log" 2015-7-24-6:0:0
"/var/log/mail.err" 2015-7-24-6:0:0
"/var/log/upstart/*.log" 2015-7-24-6:0:0
"/var/log/user.log" 2015-7-24-6:0:0
"/var/log/mail.info" 2015-7-24-6:0:0
"/var/log/cron.log" 2015-7-24-6:0:0
"/var/log/messages" 2015-7-24-6:0:0

●RHEL系の場合

RHEL系の場合は、「/var/lib/logrotate.status」というファイルに各ログで最後にログローテーションした日付が記述されている。

[root@test-centos7 ~]# cat /var/lib/logrotate.status
logrotate state -- version 2
"/var/log/yum.log" 2015-5-29-3:6:1
"/var/log/httpd/ssl_access_log" 2015-7-12-3:0:0
"/var/log/httpd/*log" 2015-6-14-3:0:0
"/var/log/httpd/error_log" 2015-7-26-3:50:1
"/var/log/httpd/ssl_error_log" 2015-7-26-3:50:1
"/var/log/wtmp" 2014-12-19-6:0:0
"/var/log/chrony/*.log" 2015-6-29-3:0:0
"/var/log/spooler" 2015-7-26-3:50:1
"/var/log/btmp" 2015-7-1-3:21:1
"/var/log/iscsiuio.log" 2015-6-29-3:0:0
"/var/log/maillog" 2015-7-26-3:50:1
"/var/log/httpd/ssl_request_log" 2015-7-12-3:0:0
"/var/log/wpa_supplicant.log" 2014-12-19-6:0:0
"/var/log/secure" 2015-7-26-3:50:1
"/var/log/ppp/connect-errors" 2014-12-19-6:0:0
"/var/log/messages" 2015-7-26-3:50:1
"/var/log/httpd/access_log" 2015-7-26-3:50:1
"/var/log/cron" 2015-7-26-3:50:1

 

後は、ローテーションさせたいログの日付を変更し、以下のコマンドを実行すれば良い。

/usr/sbin/logrotate /etc/logrotate.conf

 

2015/08/02 追記
もしくは、以下のように「-f」オプション付きでコマンドを実行することで強制的にローテーションさせることができるようだ。

/usr/sbin/logrotate -f /etc/logrotate.conf
rsyslog 実践ログ管理入門 rsyslog 実践ログ管理入門

sedでメールアドレスを『○○○@●●●●●』というようにマスキング置換する

$
0
0

phpなどのログでメールアドレスを記録していると、個人情報保護の観点から別の部署や開発会社にデータを渡す際に、アドレスがわからないようマスキングする必要があったりする。
そんな時は、以下のようにsedで一括置換をすればいい。
※『○○○@●●●●●』の箇所はお好みで変更。

sed "s/[^@ ]*@[^@]*\.[^@ ]*/○○○@●●●●●/g" ファイルPATH

実際に実行した結果が以下。

[root@test-centos7 ~]# cat /work/test.log
[2015/09/06 11:00:00] send mail to 'aaaa@aaaaa.co.jp'
[2015/09/06 11:05:00] send mail to 'bbbb@aaaaa.co.jp'
[2015/09/06 11:10:00] send mail to 'cccc@aaaaa.com' and 'cccc@rrrrr.or.jp'
[2015/09/06 11:15:00] send mail to 'dddd@ddddddd.com'
[root@test-centos7 ~]# sed "s/[^@ ]*@[^@]*\.[^@ ]*/○○○@●●●●●/g" /work/test.log
[2015/09/06 11:00:00] send mail to ○○○@●●●●●
[2015/09/06 11:05:00] send mail to ○○○@●●●●●
[2015/09/06 11:10:00] send mail to ○○○@●●●●● and ○○○@●●●●●
[2015/09/06 11:15:00] send mail to ○○○@●●●●●

20150906_000001

 

以上。
とりあえず全角でマスキングしたけれど、本来ならば半角の英数字(Xとか)などでマスキングしてあげたほうがいいかもしれない。

シェルプログラミング実用テクニック (Software Design plus) シェルプログラミング実用テクニック (Software Design plus)

sedで日本語(マルチバイト文字)のみを置換する

$
0
0

ときおり、ログやテキストファイル内の日本語文字列のみをマスキング(●とかに)置換したいと考える事がある。
そんな時は、sedで以下のようにコマンドを実行すると良いだろう。

LANG=C sed 's/[\x80-\xFF]//g' ファイルPATH

実際に実行した結果がこちら。

20150906_000002

[root@test-centos7 ~]# cat' /work/test2.log
[2015/09/06 11:00:00] send mail to 'aaaa@aaaaa.co.jp' '田中一郎'
[2015/09/06 11:05:00] send mail to 'bbbb@aaaaa.co.jp' '山田二郎'
[2015/09/06 11:10:00] send mail to 'cccc@aaaaa.com' and 'cccc@rrrrr.or.jp' '佐藤三郎'
[2015/09/06 11:15:00] send mail to 'dddd@ddddddd.com' '天草四郎'
[root@test-centos7 ~]#
[root@test-centos7 ~]# sed 's/[\x80-\xFF]/●/g' /work/test2.log
sed: -e expression #1, char 19: 無効な照合文字です
[root@test-centos7 ~]#
[root@test-centos7 ~]# LANG=C sed 's/[\x80-\xFF]/●/g' /work/test2.log
[2015/09/06 11:00:00] send mail to 'aaaa@aaaaa.co.jp' '●●●●●●●●●●●●'
[2015/09/06 11:05:00] send mail to 'bbbb@aaaaa.co.jp' '●●●●●●●●●●●●'
[2015/09/06 11:10:00] send mail to 'cccc@aaaaa.com' and 'cccc@rrrrr.or.jp' '●●●●●●●●●●●●'
[2015/09/06 11:15:00] send mail to 'dddd@ddddddd.com' '●●●●●●●●●●●●'
[改訂新版] シェルスクリプト基本リファレンス  --#!/bin/shで、ここまでできる (WEB+DB PRESS plus) [改訂新版] シェルスクリプト基本リファレンス  --#!/bin/shで、ここまでできる (WEB+DB PRESS plus)

sedで行頭以外の置換を指定する

$
0
0

sedで行頭を指定する場合、「^」を頭につける事で対応するが、では行頭以外を指定する場合はどうすればいいのだろうか。
その場合は、以下のようにコマンドを実行することで指定可能だ。

sed 's/\([^^]\)置換前文字列/置換後文字列/g' ファイルPATH

実際に実行した結果がこちら。

20150906_000003

[root@test-centos7 ~]# sed 's/^test/aaaa/g' /work/test.txt
aaaaline1="test1"
aaaaline2="test2"

aaaaline3='test7'
aaaaline4='test4'

aaaaline5 test5
aaaaline6 = test6
[root@test-centos7 ~]# sed 's/\([^^]\)test/aaaa/g' /work/test.txt
testline1=aaaa1"
testline2=aaaa2"

testline3=aaaa7'
testline4=aaaa4'

testline5aaaa5
testline6 =aaaa6

ログなどで、行頭にあるタイムスタンプ以外の日付を全て置換したい時などに有効だろう。

AWK実践入門 AWK実践入門

シェルスクリプトで、配列内の文字列と一致しない場合の処理を記述する

$
0
0

シェルスクリプトで、配列内の文字列と一致するかどうかで動作を切り替えたい事があったので、その備忘。
関数を作成しない場合、以下のようにすることで配列内に値がない場合は指定した動作を行わせる事ができる。

例)array配列内に、変数wordで指定した文字列がない場合、ifで指定した処理を実行させる。

#!/bin/sh
array=("one" "two" "three");
word=$1

if ! `echo ${array[@]} | grep -q "$word"` ; then
    echo "値がありませんでした"
fi
[root@test-centos7 ~]# sh -x /work/test4.sh one
+ array=("one" "two" "three")
+ word=one
++ echo one two three
++ grep -q one
[root@test-centos7 ~]# sh -x /work/test4.sh four
+ array=("one" "two" "three")
+ word=four
++ echo one two three
++ grep -q four
+ echo $'\345\200\244\343\201\214\343\201\202\343\202\212\343\201\276\343\201\233\343\202\223\343\201\247\343\201\227\343\201\237'
値がありませんでした

 

その他にも色々とやり方があるようなので、興味があるのであればこちらを参考にすると良いだろう。

すべてのUNIXで20年動くプログラムはどう書くべきか デプロイ・保守に苦しむエンジニア達へ贈る[シェルスクリプトレシピ集] すべてのUNIXで20年動くプログラムはどう書くべきか デプロイ・保守に苦しむエンジニア達へ贈る[シェルスクリプトレシピ集]

sedで特定の文字列~文字列間を置換する

$
0
0

sedでは、ある文字列~文字列間の行を置換する、と言った指定をすることが出来る。

sed '/文字列(開始)/,/文字列(終了)/s/○○○/●●●/g' 対象のファイルPATH

20150910_000000

[root@test-centos7 ~]# cat test.txt
testline1="test1"
testline2="test2"

testline3='test7'
testline4='test4'

testline5 test5
testline6 = test6
[root@test-centos7 ~]#
[root@test-centos7 ~]# sed '/line2/,/line3/s/test/aaaa/g' test.txt
testline1="test1"
aaaaline2="aaaa2"

aaaaline3='aaaa7'
testline4='test4'

testline5 test5
testline6 = test6

もちろん、行そのものの入れ替えをすることも可能だ。

[root@test-centos7 ~]# sed '/line2/,/line3/caaaa' test.txt
testline1="test1"
aaaa
testline4='test4'

testline5 test5
testline6 = test6

個人的には、ソースコードなどに記述されている文章を入れ替えたりする際などに役に立つので、結構便利だったりする。

UNIXシェルスクリプト マスターピース132 UNIXシェルスクリプト マスターピース132

uniqコマンドで覚えておきたい使い方6個

$
0
0

uniqコマンドは、Linux/UNIXで使用される、重複した行を圧縮して出力してくれるコマンドだ。
今回は、このコマンドについて覚えておきたい使い方についてを紹介する。

1.基本的な使い方

基本的には、以下のように使用することで標準出力の内容から重複行を圧縮して表示させることが出来る。

20150913_000000

[root@test-centos7 ~]# cat /test/test3.txt
aaaaa
aaaaa
aaaaa
bbbbb
bbbbb
bbbbb
bbbbb
bbbbb
ccccc
ccccc

[root@test-centos7 ~]# cat /test/test3.txt | uniq
aaaaa
bbbbb
ccccc

この時注意したいのが、「連続していない行」の場合は圧縮しないという点だ。 たとえば、以下のような状態でuniqコマンドを実行しても、重複した行は残ってしまう。

[root@test-centos7 ~]# cat /test/test4.txt
aaaaa
aaaaa
bbbbb
bbbbb
aaaaa
bbbbb
bbbbb
ccccc
ccccc
bbbbb

[root@test-centos7 ~]# cat /test/test4.txt | uniq
aaaaa
bbbbb
aaaaa
bbbbb
ccccc
bbbbb

2.重複している行の数をカウントする

「-c」オプションを使用することで、重複行が何行あったのかを左はじに表示してくれる。

20150916_000000

[root@test-centos7 ~]# cat /test/test3.txt
aaaaa
aaaaa
aaaaa
bbbbb
bbbbb
bbbbb
bbbbb
bbbbb
ccccc
ccccc

[root@test-centos7 ~]# cat /test/test3.txt | uniq -c
      3 aaaaa
      5 bbbbb
      2 ccccc
      1

3.重複した行・重複していない行だけを表示させる

重複した行、重複していない行だけを表示させることも出来る。
重複している行のみを出力させる場合は「-d」を、重複のない(ユニークな)行をのみを出力させる場合は「-u」オプションを付与する。

20150916_000001

[root@test-centos7 ~]# cat /test/test3.txt
aaaaa
aaaaa
aaaaa
aaaa1
bbbbb
bbbbb
bbbbb
bbbbb
bbbbb
bbbb2
ccccc
ccccc

[root@test-centos7 ~]# cat /test/test3.txt | uniq -d
aaaaa
bbbbb
ccccc
[root@test-centos7 ~]# cat /test/test3.txt | uniq -u
aaaa1
bbbb2

なお、「-d」ではなく「-D」を使用すると、重複している行を圧縮せずに表示させることが出来る。

20150916_000002

[root@test-centos7 ~]# cat /test/test3.txt
aaaaa
aaaaa
aaaaa
aaaa1
bbbbb
bbbbb
bbbbb
bbbbb
bbbbb
bbbb2
ccccc
ccccc

[root@test-centos7 ~]# cat /test/test3.txt | uniq -D
aaaaa
aaaaa
aaaaa
bbbbb
bbbbb
bbbbb
bbbbb
bbbbb
ccccc
ccccc

4.大文字・小文字を区別せずに判断する

大文字・小文字を区別せずに重複行か否かを判断させる場合は、「-i」オプションを使用する。

20150919_000000

[root@test-centos7 ~]# cat /test/test4.txt
aaaaa
AAAAA
aaaaa
bbbbb
bbbbb
BBBBB
bbbbb
ccccc
CCCCC
ccccc
[root@test-centos7 ~]# cat /test/test4.txt | uniq
aaaaa
AAAAA
aaaaa
bbbbb
BBBBB
bbbbb
ccccc
CCCCC
ccccc
[root@test-centos7 ~]# cat /test/test4.txt | uniq -i
aaaaa
bbbbb
ccccc

5.指定した項目数、文字数をスキップして重複しているかどうかを判断する

各行で指定した項目数、文字数をスキップして、その範囲内で重複しているかどうかを判断させることも出来る。
スキップする項目数は「-f」、文字数は「-s」で指定出来る。

20150919_000001

[root@test-centos7 ~]# cat /test/test5.txt
aaaaa bbbbb
aabbb bbbbb
ccbbb ccccc
ddbbb ccccc
bbbbb ccccc
eeeeb ddddd
[root@test-centos7 ~]#
[root@test-centos7 ~]# # 項目をスキップする
[root@test-centos7 ~]# cat /test/test5.txt | uniq -f 1
aaaaa bbbbb
ccbbb ccccc
eeeeb ddddd
[root@test-centos7 ~]#
[root@test-centos7 ~]# # 文字をスキップする
[root@test-centos7 ~]# cat /test/test5.txt | uniq -s 6
aaaaa bbbbb
ccbbb ccccc
eeeeb ddddd
[root@test-centos7 ~]#
[root@test-centos7 ~]# # 頭から2文字スキップし、3文字で重複を確認する
[root@test-centos7 ~]# cat /test/test5.txt | uniq -s 2 -w 3
aaaaa bbbbb
aabbb bbbbb
eeeeb ddddd

6.重複しているかどうか判断する文字数を指定する

先の項目でも少し触れているが、「-w」オプションを付与することで重複しているかどうか判断する文字数を指定することが出来る。

20150919_000002

[root@test-centos7 ~]# cat /test/test5.txt
aaaaa bbbbb
aabbb bbbbb
ccbbb ccccc
ddbbb ccccc
bbbbb ccccc
eeeeb ddddd
[root@test-centos7 ~]#
[root@test-centos7 ~]# cat /test/test5.txt | uniq -w 2
aaaaa bbbbb
ccbbb ccccc
ddbbb ccccc
bbbbb ccccc
eeeeb ddddd
[改訂新版] シェルスクリプト基本リファレンス  --#!/bin/shで、ここまでできる (WEB+DB PRESS plus) [改訂新版] シェルスクリプト基本リファレンス  --#!/bin/shで、ここまでできる (WEB+DB PRESS plus)

sortコマンドで覚えておきたい使い方9個

$
0
0

Linux/UNIXでよく使用される、出力される内容を並び替えするsortコマンド。
今回は、このsortコマンドで覚えておきたい使い方についてを紹介する。

1.基本的な使い方

基本的には、以下のようにコマンドを実行することでその出力内容を並び替える事が出来る。

20150923_000000

[root@test-centos7 ~]# cat /work/test5.txt
5 eeeee
1 aaaaa
4 ddddd
2 bbbbb
6 fffff
3 ccccc
[root@test-centos7 ~]# cat /work/test5.txt | sort
1 aaaaa
2 bbbbb
3 ccccc
4 ddddd
5 eeeee
6 fffff

2.文字列を数字として並び替えを行う

通常、sortコマンドで並び替えを行う場合、文字列として並び替えされてしまう。
それを数字として並び替える場合、「-n」オプションを付与する。

20150923_000001

[root@test-centos7 ~]# cat /work/test5.txt
5 eeeee
1 aaaaa
9 iiiii
4 ddddd
8 hhhhh
10 jjjjj
2 bbbbb
6 fffff
7 ggggg
3 ccccc
[root@test-centos7 ~]# cat /work/test5.txt | sort
1 aaaaa
10 jjjjj
2 bbbbb
3 ccccc
4 ddddd
5 eeeee
6 fffff
7 ggggg
8 hhhhh
9 iiiii
[root@test-centos7 ~]# cat /work/test5.txt | sort -n
1 aaaaa
2 bbbbb
3 ccccc
4 ddddd
5 eeeee
6 fffff
7 ggggg
8 hhhhh
9 iiiii
10 jjjjj

3.逆順で並び替えを行う

並び替えを逆順(降順)で行う場合は、「-r」オプションを付与する。

20150923_000003

[root@test-centos7 ~]# cat /work/test5.txt
5 eeeee
1 aaaaa
9 iiiii
4 ddddd
8 hhhhh
10 jjjjj
2 bbbbb
6 fffff
7 ggggg
3 ccccc
[root@test-centos7 ~]# cat /work/test5.txt | sort -n
1 aaaaa
2 bbbbb
3 ccccc
4 ddddd
5 eeeee
6 fffff
7 ggggg
8 hhhhh
9 iiiii
10 jjjjj
[root@test-centos7 ~]# cat /work/test5.txt | sort -nr
10 jjjjj
9 iiiii
8 hhhhh
7 ggggg
6 fffff
5 eeeee
4 ddddd
3 ccccc
2 bbbbb
1 aaaaa

4.並び替えを行う列を指定する

並び替えを行う列を指定する場合は、「-k」オプションを用いてその列を指定する事も出来る。複数指定する場合は、優先順位ごとに「,」で区切る。
例えば、以下の例では3列目で並び替えを実施している。

20150923_000006

[root@test-centos7 ~]# cat /work/test5.txt
5 eeeee 9
1 aaaaa 10
9 iiiii 1
4 ddddd 3
8 hhhhh 2
10 jjjjj 5
2 bbbbb 4
6 fffff 6
7 ggggg 8
3 ccccc 7
[root@test-centos7 ~]# cat /work/test5.txt | sort -n
1 aaaaa 10
2 bbbbb 4
3 ccccc 7
4 ddddd 3
5 eeeee 9
6 fffff 6
7 ggggg 8
8 hhhhh 2
9 iiiii 1
10 jjjjj 5
[root@test-centos7 ~]# cat /work/test5.txt | sort -n -k3
9 iiiii 1
8 hhhhh 2
4 ddddd 3
2 bbbbb 4
10 jjjjj 5
6 fffff 6
3 ccccc 7
7 ggggg 8
5 eeeee 9
1 aaaaa 10

なお、通常であれば各列の区切りはスペースやTabとなっているが、特定の文字列(例えばカンマなど)で列が区切られている場合は、「-t」オプションで指定することが出来る。
以下の例では、「-t」で「,(カンマ)」区切りを指定している。

20150923_000007

[root@test-centos7 ~]# cat /work/test5_1.txt
5,eeeee,9
1,aaaaa,10
9,iiiii,1
4,ddddd,3
8,hhhhh,2
10,jjjjj,5
2,bbbbb,4
6,fffff,6
7,ggggg,8
3,ccccc,7
[root@test-centos7 ~]# cat /work/test5_1.txt | sort -nk3 -t,
9,iiiii,1
8,hhhhh,2
4,ddddd,3
2,bbbbb,4
10,jjjjj,5
6,fffff,6
3,ccccc,7
7,ggggg,8
5,eeeee,9
1,aaaaa,10

5.大文字・小文字の区別をしない

sortコマンドでは、通常だとアルファベットの大文字、小文字を区別して並び替えを行う。
これを大文字、小文字の区別なく並び替えさせる場合は、「-f」オプションを付与する

20150923_000008

[root@test-centos7 ~]# cat /work/test5_2.txt
aaaaaa
bbbbbb
DDDDDD
AAAAAA
cccccc
dddddd
eeeeee
CCCCCC
[root@test-centos7 ~]# cat /work/test5_2.txt | sort
AAAAAA
CCCCCC
DDDDDD
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee
[root@test-centos7 ~]# cat /work/test5_2.txt | sort -f
AAAAAA
aaaaaa
bbbbbb
CCCCCC
cccccc
DDDDDD
dddddd
eeeeee

6.バイト数(KB、MB、GB etc…)を並び替えする

人間が読みやすい状態で出力されたバイト数を並び替えるには、「-h」オプションを利用する。

20150923_000009

[root@test-centos7 ~]# du -h /etc | head
24K     /etc/pki/rpm-gpg
176K    /etc/pki/ca-trust/extracted/java
312K    /etc/pki/ca-trust/extracted/openssl
600K    /etc/pki/ca-trust/extracted/pem
1.1M    /etc/pki/ca-trust/extracted
0       /etc/pki/ca-trust/source/anchors
0       /etc/pki/ca-trust/source/blacklist
4.0K    /etc/pki/ca-trust/source
1.1M    /etc/pki/ca-trust
0       /etc/pki/java
[root@test-centos7 ~]# du -h /etc | sort -hr | head
22M     /etc
11M     /etc/selinux/targeted
11M     /etc/selinux
5.8M    /etc/udev
5.6M    /etc/selinux/targeted/modules/active
5.6M    /etc/selinux/targeted/modules
4.8M    /etc/selinux/targeted/modules/active/modules
3.7M    /etc/selinux/targeted/policy
1.8M    /etc/selinux/targeted/contexts
1.7M    /etc/selinux/targeted/contexts/files

※なお、findとlsを組み合わせた出力をsortしたところ、うまく出力されなかった。
awkでサイズを左端にするとうまく動作するようだが、理由は不明。

7.sort時に重複している行を圧縮する

sort時に重複している行を削除する場合は、「-u」オプションを使用する。

20150923_000010

[root@test-centos7 ~]# cat /work/test5_3.txt | sort -n
1 aaaaa 10
1 aaaaa 10
2 bbbbb 4
3 ccccc 7
4 ddddd 3
4 ddddd 3
5 eeeee 9
6 fffff 6
7 ggggg 8
7 ggggg 8
8 hhhhh 2
9 iiiii 1
10 jjjjj 5
10 jjjjj 5
[root@test-centos7 ~]# cat /work/test5_3.txt | sort -un
1 aaaaa 10
2 bbbbb 4
3 ccccc 7
4 ddddd 3
5 eeeee 9
6 fffff 6
7 ggggg 8
8 hhhhh 2
9 iiiii 1
10 jjjjj 5

8.sort済のファイルに結果をマージする

すでにsort済の各ファイルをマージする場合は、「-m」オプションで行う事が出来る。

20150923_000012

[root@test-centos7 ~]# cat /work/test5_4.txt
1 aaaaa 10
2 bbbbb 4
3 ccccc 7
4 ddddd 3
5 eeeee 9
6 fffff 6
7 ggggg 8
8 hhhhh 2
9 iiiii 1
10 jjjjj 5
[root@test-centos7 ~]# cat /work/test5_5.txt
5 dadadad
9 aaaaaaaaa
11 dadadadadada
12 cccccccccccc
[root@test-centos7 ~]# sort -nm /work/test5_4.txt /work/test5_5.txt
1 aaaaa 10
2 bbbbb 4
3 ccccc 7
4 ddddd 3
5 dadadad
5 eeeee 9
6 fffff 6
7 ggggg 8
8 hhhhh 2
9 aaaaaaaaa
9 iiiii 1
10 jjjjj 5
11 dadadadadada
12 cccccccccccc

9.ファイルが順番どおりに並び替えられているか確認する

「-c」オプションを使用すると、そのファイルがソート済かどうかを確認することが出来る。

20150924_000000

[root@test-centos7 ~]# cat /work/test5_3.txt
7 ggggg 8
5 eeeee 9
1 aaaaa 10
10 jjjjj 5
9 iiiii 1
4 ddddd 3
8 hhhhh 2
1 aaaaa 10
10 jjjjj 5
2 bbbbb 4
4 ddddd 3
6 fffff 6
7 ggggg 8
3 ccccc 7
[root@test-centos7 ~]# sort -c /work/test5_3.txt
sort: /work/test5_3.txt:2: 順序が不規則: 5 eeeee 9
[root@test-centos7 ~]# sort /work/test5_3.txt | sort -c
シェルスクリプトマガジン vol.30 シェルスクリプトマガジン vol.30

Linux・UNIXでExcelのフィルタのように、ファイルから〇〇以上、〇〇以下で行を抽出する方法

$
0
0

LinuxやUNIXで、Excelのフィルタ機能のように特定の列で〇〇以上、〇〇以下といった指定方法で行を抽出する場合は、awkを使うとカンタンだ。
awkで特定列の値が〇〇以上の行を指定する場合は、以下のように指定する。

awk '列 >= 条件' 対象ファイル

 

複数条件を指定する場合は、以下のように「&&」で繋げる。
例えば、特定列の値が〇〇以上、〇〇以下といった指定をする場合は、以下のようにする。

awk '列 >= 条件 &amp;amp;amp;&amp;amp;amp; 列 <= 条件' 対象ファイル

20150925_000000

[root@test-centos7 ~]# cat /work/test5_7.txt
1 aaaaa 10
2 bbbbb 4
3 ccccc 7
4 ddddd 3
5 eeeee 9
6 fffff 6
7 ggggg 8
8 hhhhh 2
9 iiiii 1
10 jjjjj 5
[root@test-centos7 ~]# awk '$1 >=3' /work/test5_7.txt
3 ccccc 7
4 ddddd 3
5 eeeee 9
6 fffff 6
7 ggggg 8
8 hhhhh 2
9 iiiii 1
10 jjjjj 5
[root@test-centos7 ~]# awk '$1 >=3 && $1 <=7' /work/test5_7.txt
3 ccccc 7
4 ddddd 3
5 eeeee 9
6 fffff 6
7 ggggg 8

もちろん、特定列の値を指定することも出来る。

awk '列 == 条件' 対象ファイル

20150925_000001

[root@test-centos7 ~]# cat /work/test5_7.txt
1 aaaaa 10
2 bbbbb 4
3 ccccc 7
4 ddddd 3
5 eeeee 9
6 fffff 6
7 ggggg 8
8 hhhhh 2
9 iiiii 1
10 jjjjj 5
[root@test-centos7 ~]# awk '$2=="ccccc"' /work/test5_7.txt
3 ccccc 7

このように、Linux/UNIXのコマンドライン上でExcelのフィルタのような抽出をするなら、awkを使えばカンタンに行う事が出来る。

 

AWK実践入門 AWK実践入門

awkで[](カギカッコ)内の値に応じて行を抽出する

$
0
0

仕事で、Apacheのログ・ファイルから[](カギカッコ)内に記述されている応答時間で、時間のかかっているログのみを抽出するといった対応があった。
で、とりあえず〇〇秒以上のログだけを抽出するような対応をしたので、その備忘。

対応としては、以下のようにデリミタに[](カギカッコ)を指定して、その中の値が〇〇以上のログだけを抽出するようにした。

awk -F '[][]' '$4 >= 〇〇' ログファイルPATH

20150925_000002

[root@test-centos7 ~]# cat /var/log/httpd/access_log-20150906
::1 - - [02/Aug/2015:15:33:22 +0900] "OPTIONS * HTTP/1.0" 200 - "-" "Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16 (internal dummy connection)" [0]
::1 - - [02/Aug/2015:15:33:22 +0900] "OPTIONS * HTTP/1.0" 200 - "-" "Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16 (internal dummy connection)" [20]
::1 - - [02/Aug/2015:15:33:22 +0900] "OPTIONS * HTTP/1.0" 200 - "-" "Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16 (internal dummy connection)" [0]
::1 - - [02/Aug/2015:15:33:22 +0900] "OPTIONS * HTTP/1.0" 200 - "-" "Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16 (internal dummy connection)" [50]
::1 - - [02/Aug/2015:15:33:22 +0900] "OPTIONS * HTTP/1.0" 200 - "-" "Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16 (internal dummy connection)" [10]
[root@test-centos7 ~]# awk -F '[][]' '$4 >= 20' /var/log/httpd/access_log-20150906
::1 - - [02/Aug/2015:15:33:22 +0900] "OPTIONS * HTTP/1.0" 200 - "-" "Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16 (internal dummy connection)" [20]
::1 - - [02/Aug/2015:15:33:22 +0900] "OPTIONS * HTTP/1.0" 200 - "-" "Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16 (internal dummy connection)" [50]

 

AWK実践入門 AWK実践入門

LinuxのCUIでアメリカ市場の株価チェックを出来る『Mop』コマンド

$
0
0

サラリーマン投資家も増えた昨今、仕事中でも株価を確認したい人もいるだろう。
もしそれがアメリカ市場ならば、この『Mop』コマンドを使用することでコンソール上でその株価を調べる事も可能だ。

1.インストール

まずはインストール。
『Mop』はgoで記述されているので、対象マシンにはすでにgo及びgitがインストールされている事が前提となる。

go get github.com/michaeldv/mop
cd $GOPATH/src/github.com/michaeldv/mop
make install

 

完了後、goでインストールしたコマンドを利用出来るようにPATHを通す必要がある。

echo 'export PATH="$PATH:$GOPATH/bin"' >> $HOME/.bashrc
source ~/.bashrc

2.コマンド実行

後は、コマンドを実行するだけだ。

cmd

20150926_000000

株価の他、対円、対ユーロなども確認することが出来るようだ。
銘柄を追加する場合は、「+」キーで銘柄名を入力すると行える。

株解析チャートから自動発注ロボットまで! Excel VBAで極めるシステムトレード 株解析チャートから自動発注ロボットまで! Excel VBAで極めるシステムトレード
Viewing all 498 articles
Browse latest View live




Latest Images