conf t

インフラエンジニアのメモ

linux trコマンドの使い方

前回に引き続き、 以下ワンライナーの中身を理解していきます。
今回はtrコマンドの使い方です。

cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 32 | sort | uniq

trコマンド

tr -dc 'a-zA-Z0-9'

trは文字置換のコマンド

# echo aabbcc | tr aa xx
xxbbcc

第一引数で置換対象、第二引数で置換後の文字を指定する この例だとaaをxxに置換している
※後で気づくがこの認識は間違っていた

-cオプション

# echo aabbcc | tr -c aa xx
aaxxxxx

-cオプションはmanによると、
「SET1 を、 SET1 自身の補集合 (SET1 に含まれない文字すべて) で置き換える。」
となっている。分かりずらいが、上記の例でいうと、
aa以外のものをxxに置き換える という意味。 だから、bbとccが置換された。また、改行もaa以外ということになるため、xに置換されている。

ここで疑問が一つ。aabbccaというように、aaでなくa単体に当てはまるのか

# echo aabbcca | tr -c aa xx
aaxxxxax

結果、aは置換されなかった。(つまりaaに当てはまったということ?)

調べると、tr aa xx の意味は、 「aa」を「xx」に置換する
という意味ではなく、
「a」を「x」に、「a」を「x」に
置換するという意味になる。

つまり、trでは1文字ずつの置換にしか対応しておらず、さらに
trで指定する2つの引数は、それぞれ先頭から1文字ずつが順番に置換前、置換後の文字の関係に
なっているということがわかった。

引数1は引数2に1文字ずつ対応する必要があるため、trの2つの引数の文字数は同じにしておく必要がある。

1つの文字に複数の置換後の文字を紐づけた場合

# echo aabbcca | tr  aaa ABC
CCbbccC

1つの文字に複数の置換後の文字を紐づけた場合、最も後に紐づけられた文字に 置換される。この場合は a-A,a-B,a-Cと紐づけられるが、最も後のa-Cが適用されている。

範囲指定

# echo aabbcca | tr  a-z A-Z
AABBCCA

trでは小文字から大文字への一括変換が可能。
ハイフンで範囲を指定すると、昇順で文字列に展開される。

範囲指定の順番

# echo aabbcca | tr  a-z z-a
tr: 範囲指定 `z-a' の端点が逆順に指定されています

上記のようにアルファベットをさかさまに入れ変えることが可能かどうか試したが、
出来なかった。ハイフンを使用する際は昇順でなければ認められないようだ。

-dオプション
-dオプションは置換ではなく削除をするオプション

# echo aabbcca | tr  -d a
bbcc

以上から、
tr -dc 'a-zA-Z0-9' は、
a-z、A-Z、0-9以外の文字を削除する
という意味になります。

前回と合わせて
cat /dev/urandom | tr -dc 'a-zA-Z0-9'
だと、cat /dev/urandomで生成した文字列から、a-z、A-Z、0-9以外の文字列を削除する
という意味になります。

ここでtrの引数にパスワードで使いたい文字や記号を含ませておけば、
自分の好きな条件でパスワードが生成できそうですね。