技術者になりたい何か

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

てきすとすとりーむ1

テキスト処理系コマンドその1

テキストデータを見たり加工したりするための色々。
組み合わせて使うとなんだか色々できる。

cat

ファイルの中身を表示する。
主なオプション
-n 各行の左端に行番号を付ける。

リダイレクトでつなぐと二つのファイルを一つにまとめたりできる。

$ ls
greptes greptes~ testtest yum.log yum.log-20160101
$ cat yum.log yum.log-20160101 > yum2.log
$ ls
greptes greptes~ testtest yum.log yum.log-20160101 yum2.log

head

ファイルの先頭部分表示。
デフォルトでは10行。

主なオプション

-n 行数 先頭から指定された行数表示
-c バイト数 出力するバイト数指定

$ head -n 2 /var/log/pacman.log
[2017-07-24 05:55] [PACMAN] Running 'pacman -r /mnt/ -Sy --cachedir=/mnt//var/cache/pacman/pkg --noconfirm base base-devel dosfstools openssh ccache emacs'
[2017-07-24 05:55] [PACMAN] synchronizing package lists

$ head -c 16 /var/log/pacman.log
[2017-07-24 05:5

 

tail

ファイルの末尾表示。デフォルトで10行。

おもなオプション
-n 行数 指定した行数表示
-c バイト数 指定したバイト数表示
-f ファイルの末尾に追加された行を表示し続ける

tailコマンドで特筆すべきは-fオプション。
ファイルの末尾に追加された行を表示し続けるため、リアルタイムでログを見ながら何かの作業をするときなどによく使う。

$ sudo tail -f /var/log/nginx/error.log
2017/08/16 08:39:56 [notice] 5174#5174: exiting
2017/08/16 08:39:56 [notice] 5173#5173: signal 17 (SIGCHLD) received
2017/08/16 08:39:56 [notice] 5173#5173: worker process 5174 exited with code 0
2017/08/16 08:39:56 [notice] 5173#5173: exit
2017/08/17 00:33:24 [notice] 8726#8726: using the "epoll" event method
2017/08/17 00:33:24 [notice] 8726#8726: nginx/1.12.1
2017/08/17 00:33:24 [notice] 8726#8726: OS: Linux 4.12.5-1-zen
2017/08/17 00:33:24 [notice] 8726#8726: getrlimit(RLIMIT_NOFILE): 1024:4096
2017/08/17 00:33:24 [notice] 8727#8727: start worker processes
2017/08/17 00:33:24 [notice] 8727#8727: start worker process 8728

こんな感じでリアルタイムでエラーログ見ながら修正してくときとかに便利。

nl

主なオプション

-b 形式 指定した形式で本文に行番号を付与する
-h 形式 指定した形式でヘッダに行番号を付与
-f 形式 指定した形式でフッタに行番号を付与

a すべての行
t 空白以外の行
n 行番号の付与を中止

ヘッダとかフッタとかよくわからないけどこういうことらしい。

\:\:\: ヘッダー
\:\: 本文
\: フッター

実行例

$ cat sample
\:\:\:
Header
\:\:
Ubuntu
CentOS
Fedora
\:
Footer

$ nl sample

Header

1 Ubuntu
2 CentOS
3 Fedora

Footer
nl -ha sample

1 Header

2 Ubuntu
3 CentOS
4 Fedora

Footer
$ nl -fa sample

Header

1 Ubuntu
2 CentOS
3 Fedora

4 Footer
$ nl -ba sample

Header

1 Ubuntu
2 CentOS
3 Fedora

Footer

 

使う場面があまり思い浮かばない。。。

od

主なオプション

-t 出力するフォーマットを指定する

出力タイプ
c ASCII文字
o 8進数
x 16進数

$ od sample
0000000 035134 035134 035134 044012 060545 062544 005162 035134
0000020 035134 052412 072542 072156 005165 062503 072156 051517
0000040 043012 062145 071157 005141 035134 043012 067557 062564
0000060 000162
0000061
$ od -t x sample
0000000 3a5c3a5c 480a3a5c 65646165 3a5c0a72
0000020 550a3a5c 746e7562 65430a75 534f746e
0000040 6465460a 0a61726f 460a3a5c 65746f6f
0000060 00000072
0000061
$ od -t c sample
0000000 \ : \ : \ : \n H e a d e r \n \ :
0000020 \ : \n U b u n t u \n C e n t O S
0000040 \n F e d o r a \n \ : \n F o o t e
0000060 r
0000061

これも使う場面があまり・・・プログラマな人とかは使うのかな?


cut

ファイルの各行から指定したフィールドを取り出す。

主なオプション
-c 文字数 取り出す文字位置を指定する
-d 区切り文字 フィールドの区切り文字を指定する(デフォルトはタブ)
-f フィールド 取り出すフィールドを指定する

$ cat yum.log
Aug 09 21:33:12 Updated: libgcc-4.4.7-16.el6.x86_64
Aug 09 21:33:13 Updated: dejavu-fonts-common-2.33-1.el6.noarch
Aug 09 21:33:13 Updated: tzdata-java-2015g-2.el6.noarch
Aug 09 21:33:13 Updated: libX11-common-1.6.0-6.el6.noarch
Aug 09 21:33:13 Updated: centos-release-6-7.el6.centos.12.3.x86_64
Aug 09 21:33:15 Updated: kernel-firmware-2.6.32-573.12.1.el6.noarch
Aug 09 21:33:15 Updated: ncurses-base-5.7-4.20090207.el6.x86_64
Aug 09 21:33:16 Updated: xkeyboard-config-2.11-3.el6.noarch
Aug 09 21:33:16 Updated: xorg-x11-server-common-1.15.0-36.el6.centos.x86_64
Aug 09 21:33:16 Updated: tzdata-2015g-2.el6.noarch
Aug 09 21:33:23 Updated: glibc-common-2.12-1.166.el6_7.3.x86_64
Aug 09 21:33:23 Updated: nss-softokn-freebl-3.14.3-23.el6_7.x86_64
Aug 09 21:33:27 Updated: glibc-2.12-1.166.el6_7.3.x86_64
Aug 09 21:33:27 Updated: ncurses-libs-5.7-4.20090207.el6.x86_64
Aug 09 21:33:27 Updated: bash-4.1.2-33.el6_7.1.x86_64
Aug 09 21:33:27 Updated: 1:dbus-libs-1.2.24-8.el6_6.x86_64
(以下略)

$ cut -c 5-6 yum.log
09
09
09
09
09
09
09

上記の場合日付の部分(5文字から6文字目)を取り出してる

-dでは区切り文字はデフォルトでタブ。一文字空白を区切りとして使うには" " もしくは' 'をつかうとよい。
(シングルorダブルクオーテーションで半角スペースを指定)
上記yum.logではフィールドの区切りが半角スペースなので、普通に-fだけでフィールド指定してもうまく取り出せない。
(区切りが無いとみなされるのですべて表示される?)

$ cut -d ' ' -f 3 yum.log
21:33:12
21:33:13
21:33:13
21:33:13
21:33:13
21:33:15
21:33:15
21:33:16
21:33:16

日付とパッケージ名を合わせて出したいときは一文字スペースを区切りとして、1,2,5番目のフィールドをそれぞれ取り出せばよいので

$ cut -d ' ' -f 1,2,5 yum.log
Aug 09 libgcc-4.4.7-16.el6.x86_64
Aug 09 dejavu-fonts-common-2.33-1.el6.noarch
Aug 09 tzdata-java-2015g-2.el6.noarch
Aug 09 libX11-common-1.6.0-6.el6.noarch
Aug 09 centos-release-6-7.el6.centos.12.3.x86_64
Aug 09 kernel-firmware-2.6.32-573.12.1.el6.noarch
Aug 09 ncurses-base-5.7-4.20090207.el6.x86_64
Aug 09 xkeyboard-config-2.11-3.el6.noarch
Aug 09 xorg-x11-server-common-1.15.0-36.el6.centos.x86_64
Aug 09 tzdata-2015g-2.el6.noarch

join

2つのファイルを読み込んで、それぞれの指定したフィールドが共通する行を結合する。
どちらのファイルもあらかじめ、joinで指定するフィールドでソートしておく必要がある。
エクセルとかMySQLのあんな感じを想像すると幸せな使い方が浮かびそう。

主なオプション
-j 連結するフィールドを指定する

join1 join2 の2つのファイルを一つ目のフィールドで連結する。

$ cat join1
Debian a
CentOS b
Arch c
Mint a
Ubuntu a
Fedra b

$ cat join2
Debian apt
CentOS yum
Arch pacman
Mint apt
Ubuntu apt
Fedra yum

 

$ join -j 1 join1 join2
Debian a apt
CentOS b yum
Arch c pacman
Mint a apt
Ubuntu a apt
Fedra b yum


paste

一致する行を水平方向に連結。連結時の区切り文字はデフォルトでタブ。

オプション
-d 区切り文字

さっきのファイルで実行。区切り文字を:とする。

$ paste -d ':' join1 join2
Debian a:Debian apt
CentOS b:CentOS yum
Arch c:Arch pacman
Mint a:Mint apt
Ubuntu a:Ubuntu apt
Fedra b:Fedra yum
:

tr

標準入力から読み込まれた文字列を変換とか削除とかする。

主なオプション
-d 「文字列1」でマッチした文字列を削除する。
-s 連続するパターン文字列を1文字として処理する。

クラス
[:alpha:] 英字
[:lower:] 英小文字
[:upper:] 英大文字
[:digit:] 数字
[:alnum:] 英数字
[:space:] スペース

sampleの中の英小文字を全て英大文字に変えて出力。

$ cat sample
\:\:\:
Header
\:\:
Ubuntu
CentOS
Fedora
\:
$ cat sample | tr 'a-z' 'A-Z'
\:\:\:
HEADER
\:\:
UBUNTU
CENTOS
FEDORA
\:

クラスを使って同じことをする

$ cat sample | tr [:lower:] [:upper:]
\:\:\:
HEADER
\:\:
UBUNTU
CENTOS
FEDORA
\:

\:を削除
削除するのが\なので囲ってエスケープ

$ tr -d '\\:' < sample

Header

Ubuntu
CentOS
Fedora

 

split

指定サイズでファイルを分割。
デフォルトでは1000行毎。
分割されたファイルには末尾にaa ab acがつく。

オプション
- 行数

yum.logを100行毎に分割。分割後のファイルはyumXX

$ ls
join1 join2 sample testtest yum.log yum.log-20160101 yum2.log
$ split -100 yum.log yum
$ ls
join2 testtest yum.log-20160101 yumaa yumac yumae
greptes join1 sample yum.log yum2.log yumab yumad yumaf

sort

行単位でファイル内容をソートする。
デフォルトでは昇順。

主なオプション
-b 行頭の空白無視
-f 大文字小文字の区別無視
-r 降順にソート
-n 数字を文字ではなく数値として処理
-k 列番号 指定した列の値でソート

使用例
yumaaの中で、時間よりもUpdateかInstalledかで比べたい。ので4番目の列でソートする。

$ cat yumaa
Aug 09 21:33:12 Updated: libgcc-4.4.7-16.el6.x86_64
Aug 09 21:33:13 Updated: dejavu-fonts-common-2.33-1.el6.noarch
Aug 09 21:33:13 Updated: tzdata-java-2015g-2.el6.noarch
Aug 09 21:33:13 Updated: libX11-common-1.6.0-6.el6.noarch
Aug 09 21:33:13 Updated: centos-release-6-7.el6.centos.12.3.x86_64
Aug 09 21:33:15 Updated: kernel-firmware-2.6.32-573.12.1.el6.noarch
Aug 09 21:33:15 Updated: ncurses-base-5.7-4.20090207.el6.x86_64
Aug 09 21:33:16 Updated: xkeyboard-config-2.11-3.el6.noarch
Aug 09 21:33:16 Updated: xorg-x11-server-common-1.15.0-36.el6.centos.x86_64
Aug 09 21:33:16 Updated: tzdata-2015g-2.el6.noarch
Aug 09 21:33:23 Updated: glibc-common-2.12-1.166.el6_7.3.x86_64
Aug 09 21:33:23 Updated: nss-softokn-freebl-3.14.3-23.el6_7.x86_64
Aug 09 21:33:27 Updated: glibc-2.12-1.166.el6_7.3.x86_64
Aug 09 21:33:27 Updated: ncurses-libs-5.7-4.20090207.el6.x86_64
Aug 09 21:33:27 Updated: bash-4.1.2-33.el6_7.1.x86_64
Aug 09 21:33:27 Updated: 1:dbus-libs-1.2.24-8.el6_6.x86_64
Aug 09 21:33:27 Updated: chkconfig-1.3.49.3-5.el6.x86_64
Aug 09 21:33:27 Updated: libstdc++-4.4.7-16.el6.x86_64
Aug 09 21:33:28 Updated: libcom_err-1.41.12-22.el6.x86_64
Aug 09 21:33:28 Updated: freetype-2.3.11-15.el6_6.1.x86_64
Aug 09 21:33:28 Updated: krb5-libs-1.10.3-42.el6.x86_64
Aug 09 21:33:28 Updated: libxml2-2.7.6-20.el6_7.1.x86_64
Aug 09 21:33:28 Updated: nspr-4.10.8-2.el6_7.x86_64
Aug 09 21:33:28 Updated: db4-4.7.25-20.el6_7.x86_64
Aug 09 21:33:28 Updated: nss-util-3.19.1-2.el6_7.x86_64
Aug 09 21:33:29 Updated: 2:shadow-utils-4.1.4.2-19.el6_6.1.x86_64
Aug 09 21:33:29 Updated: elfutils-libelf-0.161-3.el6.x86_64
Aug 09 21:33:29 Installed: augeas-libs-1.0.0-10.el6.x86_64
Aug 09 21:33:29 Updated: 2:libpng-1.2.49-2.el6_7.x86_64
Aug 09 21:33:29 Installed: json-c-0.11-12.el6.x86_64
Aug 09 21:33:29 Updated: libudev-147-2.63.el6_7.1.x86_64
(以下省略)

$ sort -k 4 yumaa
Aug 09 21:33:29 Installed: augeas-libs-1.0.0-10.el6.x86_64
Aug 09 21:33:29 Installed: json-c-0.11-12.el6.x86_64
Aug 09 21:33:41 Installed: libwmf-0.2.8.4-25.el6_7.x86_64
Aug 09 21:33:37 Updated: 14:libpcap-1.4.0-4.20130826git2dbcaa1.el6.x86_64
Aug 09 21:33:32 Updated: 1:cups-libs-1.4.2-72.el6.x86_64
Aug 09 21:33:29 Updated: 1:dbus-1.2.24-8.el6_6.x86_64
Aug 09 21:33:27 Updated: 1:dbus-libs-1.2.24-8.el6_6.x86_64
Aug 09 21:33:35 Updated: 1:perl-Compress-Raw-Zlib-2.021-141.el6_7.1.x86_64
(以下省略)

 

4番目で昇順、4番目の値が同じなら5番目を比べてソート。

$ sort -k 4,5 yumaa
Aug 09 21:33:29 Installed: augeas-libs-1.0.0-10.el6.x86_64
Aug 09 21:33:29 Installed: json-c-0.11-12.el6.x86_64
Aug 09 21:33:41 Installed: libwmf-0.2.8.4-25.el6_7.x86_64
Aug 09 21:33:37 Updated: 14:libpcap-1.4.0-4.20130826git2dbcaa1.el6.x86_64
Aug 09 21:33:32 Updated: 1:cups-libs-1.4.2-72.el6.x86_64
Aug 09 21:33:29 Updated: 1:dbus-1.2.24-8.el6_6.x86_64
Aug 09 21:33:27 Updated: 1:dbus-libs-1.2.24-8.el6_6.x86_64
(以下省略)

Installed Updatedでソートされ、その中でパッケージ名をアルファベット順に並び替えてるのが分かる。