早崎トップ 研究(気候気象) 研究(大気汚染) データリスト Linux Tips Mac Tips

MiscUsefulCommands

ちょっと便利なコマンド

ここで挙げたコマンド類は, シェルスクリプトに使って処理の自動化をはかる時などにも便利です. 下記関連ページも参照

思いつくままに追記するうちに,かなり長いファイルになってしまった. とはいえ,やたら細かく分割すると,記述場所がわかりにくくなるという弊害も生じる. 左側メニューを float するようにすれば,ページ全体の概要を示せる. 本 Web ページの情報伝達向上のための今後の課題とする (2012-01-13).

Excel ファイル 関連(*.xls or *.xlsx)

 Excel ファイル (*.xls) を CSV に変換する

(2021-07-04) xls2csv.pl は,かなり古い情報と記憶(2015年頃?). 現在はメンテされてないはずだし,そもそも今となっては *.xlsx ファイルの方が主流だろう.

  • xls2csv.pl を使う

SpreadSheet::ParseExcel が必要.CentOS の場合,yum で install 出来る.

 [自分のPCに必要なモジュールが入っているか?]
 rpm -qa | grep perl     # これだと,たくさん表示され過ぎかな
 rpm -qa | grep Spread   # これで何も表示されないなら,インストールされてない
 yum search SpreadSheet  # パッケージを探して...
 yum install perl-Spreadsheet-ParseExcel   # install しとけや

perl-SpreadSheet-ParseExcel を入れれば良い. 依存関係のため,Excel ファイル操作関連のモジュールもいくつか追加される. CPAN 使ったインストールでも良いが,個人的には yum を使った方が楽だった. perl を使いこなせない私には,CPAN 使わず yum 経由での操作で十分.

find コマンド

find コマンドは,標準オプションだけでも非常に多彩な利用方法が出来る. オプションの種類やその説明は,man find 参照. なお,CentOS の場合,日本語 man での find の記述は英語版より内容が少ない (日本語 man は,コマンド実行例などが省略されている). LANG=C にでも変更して,英語版でも man find やってみることをお薦めする.

以下では,主に実際のコマンド例を示す.

  使えそうなオプション

とはいえ,誰もが man find できる状況とも限らないので, オプションについて少し書いておく. 特に,たまにしか使わないが重要そうなもの・自分が忘れそうなものについてメモ.

ユーザ,グループで選択

  • -gid や -uid, -group, -user など
  • -nouser は,ファイルのユーザIDに対応するユーザがいなければ true
  • -user uname は,ファイルの所有者が uname なら true

ファイルサイズによる選択

  • -empty や -size など.他のオプションと併用すれば,かなり条件を狭められる
  • -empty は,カラ(file size = zero byte)のファイルを選択
  • -size N は,引数の数値 N (default: ブロック数.1 block = 512 byte)のファイルを選択. 数値に c や k などを付加すれば,バイト,キロバイト単位となる. また,"+" や "-" を付ければ,それぞれ指定サイズ超過・未満のファイルを探索する. "-size -512c" なら 512 byte 未満のファイル.

ディレクトリ階層の深さ指定

-maxdepth levels
コマンドライン引数から何階層までを対象とするのか,の指定. -maxdepth 0 はコマンドライン引数のみを対象とする
-mindepth levels
levels 未満の階層は find の対象としない. -mindepth 1 なら,全ファイル対象.
  • 例: 自分のホームページのHTMLファイル数( *.html のみ) をカウント.

ここでは,public_html/hoge/hoge/*.html だけ (public_html を含めると,3階層目のディレクトリのみ). それより上や下のディレクトリ階層の *.html ファイルは数えない.

find ./public_html -mindepth 3 -maxdepth 3 -name "*.html" -type f | wc -l

ファイル or ディレクトリのみを選択

オプション 意味
-type d ディレクトリだけを対象とする
-type f ファイルだけを対象とする
-type l シンボリックリンクだけを

時間に関する選択

オプション 内容
-mtime +n 最終修正時刻から 24 * n 時間以上以前の(古い)ものだけを選択
-mtime -n 最終修正時刻から 24 * n 時間以内の(最近の)ものだけを選択
  • -mmin だったら,後に続く数値の単位は minute になる.
  • -cmin, -ctime だったら,ファイルのステータス更新日(例: 作成日)が基準
  • -amin だったら,最終アクセスタイム.ただ,最近自分では mount オプションに "noatime" を入れる事が多いので,アクセスタイムが更新されていないはず.個人的には使えないかな

 応用例

  • rsync でディレクトリ指定に失敗し,同期したいディレクトリ内部に同一名のディレクトリが作成された. それを消去したい
    • そらまめ君の1時間値データ(年度別・県別のディレクトリ名 PP_FYYY; PP: 県コード, FYYY: 年度)の 同期に失敗した時に使った (2017-06-18)
$ ls -d *2017
01_2017/  08_2017/  15_2017/  22_2017/  29_2017/  36_2017/  43_2017/
02_2017/  09_2017/  16_2017/  23_2017/  30_2017/  37_2017/  44_2017/
03_2017/  10_2017/  17_2017/  24_2017/  31_2017/  38_2017/  45_2017/
04_2017/  11_2017/  18_2017/  25_2017/  32_2017/  39_2017/  46_2017/
05_2017/  12_2017/  19_2017/  26_2017/  33_2017/  40_2017/  47_2017/
06_2017/  13_2017/  20_2017/  27_2017/  34_2017/  41_2017/
07_2017/  14_2017/  21_2017/  28_2017/  35_2017/  42_2017/
(上記のそれぞれのディレクトリを別サーバ(最新版)のものと同期しようと rsync, 
間違えてそれぞれのディレクトリの内部に同名のディレクトリが同期されてしまった)
(つまり,01_2017/01_2017 というディレクトリが作られてしまった,ということ)

$ find -mindepth 2 -maxdepth 2 -type d -name "*_2017" -print
(リストを確認した上で...)
$ find -mindepth 2 -maxdepth 2 -type d -name "*_2017" -exec rm -rf {} \;
(!!! rm -rf と指定してるので,動作には十分注意すること.全部消されるぞ !!!)
(-mindepth 2 と指定することで,直下にあるディレクトリをfind対象から外す.
1階層下にあるディレクトリだけを選び出す)
  • 個人の $HOME/Mail/trash/ (ごみ箱フォルダに相当)以下の古い (10日以上経過)ファイルを削除
$ find ~/Mail/trash -mtime +10 -exec rm {} \;
  • 対象ディレクトリ(ここでは samples/)以下のファイル・ディレクトリの パーミッションを一括変更する
$ find samples -type f -exec chmod 660 {} \;
$ find samples -type d -exec chmod 770 {} \;
  • カレントディレクトリ以下,全階層のファイルについて, 最終修正時刻が50分以上前のファイルを選択.時刻をフォーマット指定して画面出力. ここでは,YYYY-MM-DDThh:mm:ssTZD の形式と指定.-printf 書式指定内の \n は改行を意味する
$ find -type f -mmin +50 -printf "%AY-%Am-%AdT%AT%AZ  %f \n"
  • 最終修正時刻が2日(48時間)以内のファイルを選択. 修正時刻の新しいものから順に sort して表示 (ディレクトリ内で最後に更新したファイルとその日付情報を見たい場合)
$ find -type f -mtime -3 -print | xargs ls -lt
  • 指定した条件以外のファイルを削除 (grep だったら -v オプションを使った場合に相当か)

(NOT検索またはマイナス検索と呼ばれるファイル検索に相当. 必要なファイル以外をリストアップして削除. 下記の例: 気象庁GPVデータのうち, 30日以上前のGSM予報データを削除.ただし 0時間予報値のみ残す)

$ find . -mtime +30 -name "*GSM*" ! -name "*_FD0000_*" -exec rm {} \;

(ファイル数が非常に多いと,-exec で rm コマンドを毎回呼び出すので非効率.
xargs をかましてから rm 実行すれば,rm の繰り返し呼出を抑制できる)
$ find . -mtime +30 -name "*GSM*" ! -name "*_FD0000_*" | xargs rm -rf

(上記と同様,NOT検索またはマイナス検索と呼ばれるファイル検索に相当. 下記の例: とあるディスク以下に大量にディレクトリがある場合, ディスクごと rsync をかけると lost+found までやろうとする. それを回避するための実行例. 一般ユーザで実行するなら,lost+found へのアクセス許可がないので不必要かもしれない.)

$ dir_list=`find -maxdepth 1 -type d ! -name "lost+found" ! -name "." -printf "%f "`
$ for i in $dir_list ; do echo $i ; rsync -a $i /mnt/esata01/. ; done
  • 300日以上修正されていないファイルをリストアップ(確認した上で,不要だったら消去). 作業用ディレクトリ内の過去のゴミファイルを一括削除する時に利用した.
$ find -type f -mtime +300  -printf "%t %f\n" | less
$ find -type f -mtime +300  -exec rm {} \;

たとえ重要なプログラム類が存在しても削除してしまうので要注意. 私の個人ルールとして,「作業用ディレクトリにはプログラムを絶対に置かない」と しているのは, 上記のような「掃除スクリプト」を定期実行しているため. 作業用ディレクトリには,本人が意図しなくてもゴミがたまりやすい. かといって, 容量が不足してから手動で不要ファイルを削除するのは面倒. 何より,作業領域が不足する状況というのは,急ぎの仕事を実行したいときなどである. とても掃除している時間が無い. だからこそ,自動で掃除させておく. 自分がラクをするためには,明確な「自分ルール」を作っておき,それを厳守することが必要.

  • 下部階層にあるファイルも含む,ファイル全文検索

grep, sed, awk 関連内の 指定ディレクトリ以下の全ファイル内の文字列検索 を参照

ライブラリ関連

 ライブラリの中身(関数)のリストを見る(nm コマンド)

  • ライブラリの依存関係を確認したいときに使う.
[user@localhost /usr/local/hdfeos-2.15/lib]: ll
合計 2128
-rw-r--r-- 1 root root 1064650 2009-08-19 12:07 libGctp.a
-rwxr-xr-x 1 root root     806 2009-08-19 12:07 libGctp.la*
-rw-r--r-- 1 root root 1097504 2009-08-19 12:07 libhdfeos.a
-rwxr-xr-x 1 root root     786 2009-08-19 12:07 libhdfeos.la*
[user@localhost /usr/local/hdfeos-2.15/lib]: nm libhdfeos.a

EHapi.o:
0000000000000000 r .LC0
0000000000000008 r .LC1
000000000000003f r .LC14
(中略)
0000000000002560 T swwrattr
0000000000002820 T swwrdmeta
000000000000d2b0 T swwrfld
0000000000002b70 T swwrgmeta
0000000000000000 B timeflag
  • コマンド・ライブラリの所在をサーチ
    • which : コマンドの所在をサーチ(パスが通っている場所だけ)
    • whereis : コマンド・ライブラリの両方をサーチ

 ライブラリのサーチパス追加

  • 環境変数 LD_LIBRARY_PATH に設定しておく
  • /etc/ld.so.conf.d/ 以下に,追記したいパスのリストを記載したファイルを置く. 追加後には,ldconfig -v にて更新(リストを確認するだけなら, ldconfig -p にて標準出力される).

例: (CentOS 5.3 の場合)

$ ll /etc/ld.so.conf.d/
合計 24
-rw-r--r--  1 root root 15 2009-09-04 07:28 mysql-i386.conf
-rw-r--r--  1 root root 17 2009-09-04 07:28 mysql-x86_64.conf
-rw-r--r--. 1 root root 20 2007-09-14 02:38 qt-i386.conf
-rw-r--r--. 1 root root 22 2007-09-14 02:19 qt-x86_64.conf
$ cat /etc/ld.so.conf.d/mysql-x86_64.conf 
/usr/lib64/mysql

時刻に関する雑記

 時刻表記(ISO 8601形式)

いろいろなデータを扱ううちに,データの時刻表記に関して,明確なルールを決める必要に迫られた. 実際,時間に関する繰り返し作業時には,データの日付・時刻表示形式にあわせて, 様々なパターンのスクリプトを用意する羽目になった (参考:スクリプト雛型(hysk) # dateコマンドを使った時間に関する繰り返し作業).

なお,日付・時刻処理で多用する処理は,自分専用の関数にして頻繁に使っている (関連: シェルスクリプトメモ(hysk) # 自分専用コマンド・関数).

処理後のデータ(出力ファイル名,実行ログなど)にも日付・時刻情報を付加する必要があるが, 時刻表記について「自分独自のルール」を作るのはナンセンス. こんなところで「自分らしさ」・「独自性」を追求するのは愚かな事だろう. こういう事は国際標準に従えば何かと混乱が少ない.そこで,ISO 8601 の形式を使うことにした.

ISO8601 の公式の書式は以下の通り:

YYYY-MM-DDThh:mm:ss.sssTZD

ただし,私が仕事で使うぶんには,ミリ秒単位の指定はほぼ必要無い. 従って,私個人の日付・時刻表記 default は,以下の形式とする:

YYYY-MM-DDThh:mm:ssTZD

dateコマンドで書くなら,以下のコマンド実行時の出力形式:

$ date +"%FT%T%z"
2011-07-14T11:39:24+09:00

つまり,固定長25文字 (4+1+2+1+2 +1 +2+1+2+1+2 +1 +2+1+2 = 25)の date/time 表記. 固定長なので,必要パラメータ(例えば月,日だけとか)を抜き出すのも簡単 (参照: シェルスクリプトメモ(hysk) > シェル変数に設定済みの文字列長さを知る). 一度スクリプトを作っておけば,使いまわしできる.

シェル変数に設定すれば,bash 内部コマンドを使って部分文字列を切り出す, 同変数から cut コマンドとそのフィールドセパレータ指定を組み合わせる, awk/perl などの部分文字列切り出しを使う... など,抜き出す方法は複数存在する.

上記書式の意味は見れば分かるはずだが, 近い将来に自分自身が忘れる可能性が高いので,以下にメモ.

略記号 意味
YYYY year (4-digit)
MM month (2-digit)
DD day of month (2-digit)
hh hour
mm minute
ss.ssss second
TZD time zone (Z or offset from UTC; e.g. +09:00)

詳細は,W3C のDate and Time Formatsを参照. 秒については,ミリ秒部分(小数点以下)が不要なら表記しなくて良い. また,小数点以下の桁数にも特に制約がないようだ. 表記例はこんな感じ:

2009年10月14日 日本時間(JST)で12時34分56秒
2009-10-14T12:34:56+09:00
2011年3月2日 グリニッジ標準時で3時27分18秒
2011-03-02T03:27:18Z

こういう統一形式であれば,人間にとってもある程度の可読性を有しつつ,計算機での処理も容易である.

  時刻合わせ (NTP 関連; ntpd, ntpdate)

記述を 『管理用コマンド』ページ内の 時刻合わせ(NTP関連) に移動

CentOS 7系では,ntp ではなく chrony が標準. CHRONY 関連(CentOS 7系)参照.

 時刻処理で有用なその他コマンド

date 関数がつかえれば十分なのだが,一部の機能については,date コマンドよりも簡便に仕えるコマンドがある.

時間の繰り返し処理時(seq)

(2017-03-08) 「3時間間隔のデータ(ファイル)を処理したい」という時には,

for i in 00 03 06 09 12 15 18 21 ; do
  (何か処理するコマンド)
done

とすればよい. ただし,上記8個が固定されていれば良いが,「場合によっては1時間間隔になる」,「表示桁数がゼロ埋めする or しないが場合により異なる」などがありうる. その都度リストを書き換えても構わないが,seq コマンド使えば引数やオプション変更だけでコントロールできる.

Usage: seq  (option)  初期値  増分  終了値
増分を省略時には default: 1

$ seq -w  0  3 21
00
03
06
09
12
15
18
21

for ループへ使うならこんな感じ
$ for i in $(seq -w  0  3 21); do echo $i; done

数値を減少させることにも対応:
$ for i in $(seq -w  21 -3 0); do echo $i; done

コンマ区切り表示もできる
$ seq -w -s","  0 3 30
00,03,06,09,12,15,18,21,24,27,30

浮動小数点でも可能
$ seq  -s,  5 0.5  10
5.0,5.5,6.0,6.5,7.0,7.5,8.0,8.5,9.0,9.5,10.0

-w でゼロ埋め(全部の数値が等幅表示になるようにゼロ表示個数を自動調整), -f で表示フォーマット指定(printf文の形式), -s で数字の区切り文字を変更(default: 改行(\n)文字). 詳しくは man seq 参照.

while ループ使っても同じことできるが,ループ末尾に入れるべき数値の増減を忘れて,無限ループになることもある. 私は実際に何度もやらかした事がある. 「DOY (1-365)で区分されたデータ(ファイル)をDOY 10日間隔で処理したい」とかの場合,使いでがありそうだ. 浮動小数点で使えるのも Good.

seq は,GNU Coreutils の一部らしい.CentOS 7.x 系列なら,所在は /usr/bin/seq (check 2017-03-08)

データDL

データ取得,特に自動ダウンロードとかwebページからの抜き出し(スクレイピング)について.

 wget, curl, rsync

単純な使い方は,コマンドに続いてアドレスを指定するだけ. 出力場所を指定しなければ,コマンド実行箇所のディレクトリに同名ファイルで保存される.

$ wget 対象URL
$ curl 対象URL

職場など通信に制約をかけられる環境では,proxy接続なり通信速度制限などが要求されるかもしれない. 大容量ファイルのダウンロード時に通信が切れまくる,などの場合にも帯域制限をかけた方が良い場合もある.

proxy 接続設定

帯域制限

$ wget --limit-rate=1024k 対象URL
$ wget --limit-rate=1m 対象URL
$ curl --limit-rate 1m 対象URL
$ rsync --bwlimit=1024 対象URL  保存先

rsync の bwlimit で指定する数値は,k (kilo) や m (mega) などを付けない限り kByte/sec とみなされる.see "man rsync" してから bwlimit で検索.

文字コード関連

 nkf, iconv

2011年度の途中から,日本語文字コードを UTF-8 に統一。 これまでの約15年間は EUC を使っていた.

文字コードの変換には,nkf または iconv を使う. 自分の場合は,UNIXを学び始めた頃からなじみのある,nkf を使いつづけている. ちなみに,nkf は Network Kanji Filter の略だと記憶している. 違ってたらごめんなさい.

nkf --oc=UTF-8N hoge_euc.txt > hoge_utf8.txt

オプションの UTF-8N は,出力ファイルを Byte Order Mark (BOM) を外したテキストファイルで作る,という意味. BOM が入っていると,TeX ファイルのコンパイル時に不具合が生じたので, 使わないことにした. BOM は,テキストファイル先頭に付加される3文字の事. これで endian code を区別してる.. と過去に自分が書いたメモにあったが, 正確な定義・意味は忘れた。出典も記録・記憶に無い.

入力ファイルの文字コードがわからなくて気持ち悪いなら,nkf -g を試す.

$ nkf -g hoge_unknown.txt
ISO-2022-JP

nkf による自動判別なので,間違う場合もある. iconv を使った場合の変換例は下記:

$ iconv -f ISO2022JP -t UTF8 hoge_iso2022jp.txt > hoge_utf8.txt

vi (Vim) では文字化けせずに見られたとしても,less などを使うと文字化けしていることもある. 私の場合,less の文字コード設定を変えるよりも,ファイルの文字コードを統一することにしている. 見つけ次第,その都度変換するってことにしてる.

 nkf の応用 (1) シェルスクリプト化

いちいちコマンドオプション入力するのが面倒なので, 自分専用コマンドを作った. $HOME/bin/ 以下に euc2utf8 というシェルスクリプトとして保存, 実行権限を付与しておく.

#!/bin/sh
# Convert Japanese character code from EUC into UTF-8
#
#       last update: 2010-08-12
#       1st release: 2010-07-03
#       written by M. Hayasaki (CEReS, Chiba Univ.)

if [ $# -ne 1 ]; then
  echo "Usage: euc2utf8 ./filename"
  echo -e "\t (One-file only with directory path.)"
  echo -e "\t (Time-stamp is preserved.)"
  exit 99
fi
NKF=`which nkf`

i=$1
echo $i
if [ $? -eq 0 ]; then
  file_datetime=`find -wholename "${i}" -printf "%t"`
  echo "file_datetime = $file_datetime"
####  $NKF -w $1 > tmp$$    # simple form. Before 11 Aug 2010
#  $NKF --ic=EUC-JP --oc=UTF-8N $i > tmp$$      # Assume input file is always written in EUC
  $NKF --oc=UTF-8N $i > tmp$$
  \mv -f tmp$$ $i
  touch --date="${file_datetime}"  $i
else
  echo -e "\t Warning: nkf command is NOT found."
fi

### CAUTION:
# BOM = Byte Order Mark (3-byte characters for determining big/little endian)
# UTF-8N = UTF-8 without BOM ("-w" option in nkf)
# UTF-8-BOM = UTF-8 with BOM ("-w8" option in nkf)
# UTF-8 = same as UTF-8N ("-w" option in nkf)
#
# If you try to encode shell scripts and TeX source files,
# you MUST use "UTF-8N" (UTF-8 without BOM)!

注意点および特徴は以下の通り:

  • 文字コード変換後でもファイルの最終更新日情報は保持する. 記述内容を修正してもいないのに,文字コードを変えただけで time stamp が 変更されるのは困るので
  • BOMは付けない.TeX ファイルでの問題回避のため
  • スクリプトを簡略化するため,引数は1個しか許してない. 複数のファイルを引数リストに与えられる方が好きな人は, ご自分で改造してください

 nkf の応用 (2) for ループとの組み合わせ

上記のスクリプトと shell の内部コマンドを使って, テキストファイルの文字コード変換をおこなう例を示す.

for i in *php ; do euc2utf8 ./$i ; sed 's/x-euc-jp/utf-8/' $i > hoge ; \mv -f hoge $i ; done

カレントディレクトリ内の PHP ファイルの文字コードを変換. PHP ファイル内にある文字コード指定箇所は,sed にて置換. See also grep, sed, awk 関連

sed での置換が入るので,最終修正日が更新されるけど, 実際に修正しているのだからこのままでいい

 iconv の使い方

iconv は使い慣れてないのでメモ. 関連しそうなコマンドも.

  • サポートする文字コードは,"iconv -l | less" を実行して探す. よく使いそうなのは,SHIFT_JIS (SHIFT-JIS), UTF8 (UTF-8), ISO2022JP, EUCJP (EUC-JP) あたりか.
  • ファイル内の文字でなく,ファイル名自身が文字化けしている(日本語ファイル名を使ってる)場合には,convmv コマンドが使えそう. iconv と書き方が似ている(というか,convmv 内部でiconvを利用している?).URLエンコード(ないしパーセントエンコード)されたファイル名でも "--unescape" オプション使えば変換できる.大文字・小文字の変換も可能(--upper, --lower).
$ iconv -f SHIFT_JIS  -t UTF8  hoge.txt
(このままでは文字コード変換されない.標準出力されるだけ.リダイレクションで出力先指定)
$ convmv -f SHIFT_JIS  -t UTF8  hoge.txt
(このままではファイル名の文字コード変換されない.標準出力で変換候補が表示されるだけ.変換したけりゃ --notest つける)

雑多なコマンド

 マニュアル閲覧(info, man)

個人的には man が使い慣れているので好き. しかし,一部のコマンドの中には, man の記載が貧弱で, info の方で詳細な使用法を解説するコマンドも(少数ながら?)あるようだ(記憶が曖昧).

ちなみに,ImageMagick 関連は,HTML での情報も充実.CentOS なら,

/usr/share/doc/ImageMagick-6.2.8/

以下にあるはず(バージョン番号はCentOS 5.4(?)当時). 個人的経験では,ImageMagick とGMT の HTML マニュアルを自分の bookmark に入れておくと,何かと便利だった.

info 関連

info の操作方法をよく知らなかったので,以下にまとめる:

操作 説明
Ctrl + p 上に移動
Ctrl + n 下に移動
Ctrl + v 1-page 下に移動
Alt + v 1-page 上に移動
Space key 1ページ下へ or リンクをたどる
Enter key カーソル上のリンクをたどる
n 次の節
p 前の節
u 上の節
Ctrl + s 検索

man 関連

最も基本的な man の使いかたは,"man man" で調べる.これが基本.

目的のコマンド名がわからない or 記憶が曖昧な時には,キーワード検索すれば良い.

例えば,「NFS関連で使うコマンド,ど忘れしちまった!」などという場合,

% man -k NFS

とすれば,関連コマンドが画面表示される.画面表示されれば,さすがに思い出すでしょう.

  • 参考サイト: ITPro Linux のすすめ 「コマンドのヘルプとテキストエディタ」 より
http://itpro.nikkeibp.co.jp/article/COLUMN/20080205/292932/

  管理者が知っていると便利なコマンド(watch, tail & tailf, rsync)

「Software Design Sep2010 p.69 「何でも屋」管理者が覚えておきたい3大便利コマンド」より.

See also 各種管理コマンドのメモ (hysk), セキュリティ対策

watch

コマンドを定期実行(default: 2-second interval)する.実行時間間隔は -n または --interval にて制御(秒数を整数値で指定).中断しない限り稼働しつづける(Ctrl+C で強制停止).

  • 例1: バックアップなどの際,ファイルシステムの空き容量を表示
% watch "df -kh"

tail, tailf

コンパイルログや/var/log/ 以下のログファイル表示などで使える. tailf は tail -f と類似しているが,ファイルへのアクセスタイムを更新しないという点が異なる.

rsync

どこにでも情報が書いてあるから,詳細は省略.雑誌に記載してあった内容を抜粋.

  • 例1: ローカルPC内でのディレクトリミラー(cpを使用),中断状態からのレジューム
[rsync による同期でも良いが,動作が遅い.cp  の方が早い]
% cp -a (copy source) (copy target)
[ただし,上記実行時に何かの要因で中断した場合には,rsync でレジューム]
% rsync -av --progress --delete (copy source) (copy target)

 ファイルの所在を探す(locate)

locate

同名のファイルを複数箇所に置いたが,どこに置いたか忘れてしまった... などの場合に使える.

% locate fstab

などとすれば,ファイル名に fstab を含むファイルをデータベース内から探してくれる.

ファイル所在情報データベースは, 毎日 04:02 に実行開始(see /etc/crontab; システムが自動実行する cron の設定. CentOS なら,/etc/cron.daily/mlocate.cron にて実行). 自動実行時間の合間の変更は反映されていないため, もし必要なら手動で(rootになって) /usr/bin/updatedb で更新する.

  正確な綴を覚えていないコマンドを探す,その意味を調べる (apropos)

apropos
  • ワイルドカード,正規表現などを駆使すれば,コマンドの一部しか覚えてなくても探してくれる
※使用例
$ apropos ^nam
namazu               (1)  - a search program of Namazu
named                (8)  - Internet domain name server (DNS)
named-bootconf       (8)  - convert name server configuration files
named-xfer           (8)  - ancillary agent for inbound zone transfers
named.conf [named]   (5)  - configuration file for
namei                (1)  - follow a pathname until a terminal point is found
nameif               (8)  - name network interfaces based on MAC addresses

$ apropos psxy
psxy                 (l)  - Plot lines, polygons, and symbols on maps
psxyz                (l)  - Plot lines, polygons, and symbols in 3-D

ちなみに,コマンドでなく単に英単語の綴を確認するためなら, look というコマンドが使える.

$ look internat
internat
internat.
internation
International
international
  :
(中略)
  :
internationals
internatl

意味: "internat" で始まる文字列を,
/usr/share/dict/words (CentOS 標準搭載の単語辞書ファイル)から探す

なお,look コマンドは英単語の綴確認だけでなく, ファイルを引数にあたえることで,指定ファイル内の文字列検索コマンドとして利用できる. 詳しくは man look を参照.

 文字列置換 (tr コマンド; TRanslate)

 tr 
  • 文字列の置換を単純な表記方法 (文字セット指定) でおこなう
  • コマンドの語源は translate より.先頭2文字をコマンド名に使ったようだ
  • tr コマンドを使わなくても,同様の事を実行する方法は複数存在する(はず). 別に tr に拘らず,自分が覚えやすい・使い易いものを使えば良い
※使用例1: 小文字から大文字に変換
--- script 表記例 ---
i=hogehoge
j=`echo $i | tr [:lower:] [:upper:]`
echo "Before: ${i}; After: ${j}"
--- script 表記例,ここまで ---
上記スクリプトを実行したら以下のように表示される:
Before: hogehoge; After: HOGEHOGE


※使用例2: ファイル中の改行コード (\015, ^M) を削除
cat file | tr -d '\015'
  注: かなり昔から,OS間で改行コードの違いが存在していた.
  MS-DOS/Win系(CR+LF; Carriage Return (復帰) + Line Feed (狭義の改行)),
  UNIX系(LF),古いMac系(CR)とOSごとにことごとく違っていた.
  上記の例では,UNIX系にとって余計な文字列であるCR (16進数表記で 0x0D) を削除してる.
  なお,MacOS X 以後はUNIX系の LF が使用されている.

※使用例3: (応用)単語の先頭文字だけを大文字化 (capitalize)
--- script 表記例 ---
i=hogehoge
capitalize_word=`echo -n "${i:0:1}" | tr "[:lower:]" "[:upper:]" `${i:1}
echo "Before: ${i}; After: ${capitalize_word}"
--- script 表記例,ここまで ---
上記スクリプトを実行したら以下のように表示される:
Before: hogehoge; After: Hogehoge
  • 参照: 改行コード - Wikipedia -
  • 参照: ASCII - Wikipedia -; 「制御文字」部分を参照
  • ファイル内の文字列変換でなく,ファイル名の大文字・小文字変換なら,convmv コマンドが使える.CentOS なら,yum でインストール可能だし,iconv に類似した書式なので使いやすいだろう.See iconvの使い方

 ファイルタイプを確認する (file コマンド)

file
  • ファイルの種類(ファイルタイプ)を調べる.詳細は man file にて確認
  • 文字コードの判別にも便利.海外製の測定器などが出力するCSVファイルとかだと,日本国内の常識とは必ずしも一致しない.私個人ではあまり馴染みのない,UTF16 (BOMつき)とかの形式で送られてくることもあった (add 2020-01-28)
  • 分類可能なファイルタイプは多くない(ファイルタイプ.ASCII テキスト,バイナリ,Linux 実行形式など) が,名前や拡張子で判断がつかないファイルでも大雑把に種類を確認できる
  • 今でこそ拡張子 *.doc (2007 以後は *.docx) は MS-Word 専用としてほぼ認知された(されてしまった)が, 昔は ASCII テキスト形式でもマニュアルなどの文書に *.doc を使っていた. 私自身も UNIX 上で使っていたので,MS-Word が普及し始めた頃には, 「勝手にこの拡張子を使うな! 迷惑だ!」 と憤慨した記憶がある
  • 私がこのコマンドを使うのは, 「そういや,これってバイナリファイルだったら困るなぁ」 という疑念があるとき. less とか vi でファイルの中身を見る前に,このコマンドを使う
  • 他者からもらうファイル名(拡張子名)は,必ずしも自分の命名規則と一致していない. 思い込みのためにバイナリファイルを less/vi で開いてしまったことが過去に何度もある. 旧式のOS (たしか SunOS 4.x とか初期の Solaris など)だと, バイナリファイルを less で開いたらコマンドラインが全て文字化けし, ログインしなおす羽目になった...
  • 引数にファイル名を指定."file hoge.txt" とか.

 雑多なメモ

以下に挙げるものは,雑多なコマンドの中でも,ほとんど使わないコマンド類. 覚える必要もないが,「こんなコマンドもあったなぁ」 程度の記憶から探し出すとき,きっかけになるかもしれないのでメモ.

  • nmap : 開いてるポートを調べるときに使える. See セキュリティ対策 (hysk) > netstat & nmap
  • xwininfo: X window system の情報を表示.CentOS 5.6 だと /usr/bin/ 以下で発見.
  • wireshark: ネットワーク解析ツール(パケットキャプチャなど)の1種. 一般ユーザはみだりに使うべからず.cracker と間違われても知りませんよ. 以前は ethereal という名前だったが,事情により名称変更したらしい(2006年頃?).
  • vi (vim) で複数行の先頭に同じ文字列を挿入: 矩形選択モード(Ctrl+v),行頭挿入(Shift+i),Escで戻る

更新履歴

Date Changes
2021-07-04 vi の矩形選択モードのメモを「雑多なコマンド & 雑多なメモ」に追加.ページの記載形式が不統一だった部分の微修正.
2020-01-28 file コマンドの文字コード関連のメモを追記. 測器から出てくるナマ(に近い?)CSVファイルの処理にて,馴染みのない文字コードに遭遇するという事例があった.
2019-10-09 データダウンロード用コマンドのメモを追記. あとで「データ情報」のページからリンクを張っておけ.
2019-05-29 chrony (chronyd, chronyc) 関連のリンクを追加. CentOS 7系では,ntp ではなく chrony がデフォルトになっていたのを知らなかった.
2017-06-18 find コマンドのサンプル追加. 間違って作ってしまったディレクトリを一括削除.
2016-02-27 ページ内の参照用IDを付け替え. 番号付けのルールは, Linux tips (hysk) # 自分専用ルール・HTML に従う.
2010-01-07 多分,この日に記載開始. date コマンドのサンプルを作ったのが最初だと思う.