As rookie

ルーキーインフラエンジニアがインフラのこと以外も結構書いてしまうブログ

POSIX1日1コマンド[part6]: awk

mokicks.hatenablog.com

詳細はこちらの記事へ。1日1POSIXコマンドを実行してみようというやつです。

awk

awk

とりあえず使ってみる

$ ls -la
total 0
drwxrwxr-x. 2 vagrant vagrant 45 Feb 26 01:55 .
drwxrwxr-x. 5 vagrant vagrant 51 Feb 26 01:53 ..
-rw-rw-r--. 1 vagrant vagrant  0 Feb 26 01:54 a.txt
-rw-rw-r--. 1 vagrant vagrant  0 Feb 26 01:54 b.txt
-rw-rw-r--. 1 vagrant vagrant  0 Feb 26 01:54 c.txt

$ls -la | awk '{ print "owner is " $3 ", filename is "$9 }'

owner is , filename is 
owner is vagrant, filename is .
owner is vagrant, filename is ..
owner is vagrant, filename is a.txt
owner is vagrant, filename is b.txt
owner is vagrant, filename is c.txt

awk を知る

ざっくり使い方

awk [-F sepstring] [-v assignment]... program [argument...]

awk [-F sepstring] -f progfile [-f progfile]... [-v assignment]...
       [argument...]

ざっくりDESCRIPTION

パターンをスキャンし処理するプログラム言語の一つ。テキストデータの処理に特化している。一連のパターンと対応するアクション。パターンと一致する入力が読み取られると、そのパターンに関連付けられたアクションが実行される。

入力は一連のレコードとして認識される。デフォルトでは、レコードは行で、改行で終了します。ですがこれは、RS という組み込み変数を使うと変更することができます。

入力の各レコードは、順番にプログラムの各行と照合される。一致した各行は、関連するアクションを実行しなければならない。
awkは各入力のレコードを一連のフィールドとして解釈する。デフォルトでのフィールどの文字列は、「空白」、「改行」以外の文字です。このデフォルトの「空白」、「改行」という区切り文字は、FS という組み込み変数、もしくは -F オプションで変更できる。

レコードのフィールドは、最初の文字から $1 $2 ... で使えます。
また、$0 はレコード全体を示します。他のフィールドを設定すると $0 の再評価が行われる。$ 0に代入すると、他のすべてのフィールドとNF組み込み変数の値がリセットされる。

ざっくりOPTION

  • -F
    • フィールド区切り文字を定義します。ただし、-F <区切り文字>と-v FS = <区切り文字>の両方が使用されている場合、-F <区切り文字>からのFS割り当てがコマンド行順で処理されるか、最後の-v FS = <区切り文字>の後で処理されるかは不特定です。
  • -f progfile
    • awkプログラムを含むファイルプログラムファイルのパス名を指定します。 ' - 'が指定された場合は、標準入力を示すものとする。このオプションの複数のインスタンスが指定された場合、指定された順序でプログラムファイルとして指定されたファイルの連結は、awkプログラムになります。 awkプログラムは、代わりにコマンドラインで1つの引数として指定することもできます。
  • -v assignment
    • 代入引数が代入オペランドと同じ形式であることを保証しなければならない。指定された変数の割り当ては、BEGINパターン(もしあれば)に関連するアクションを含む、awkプログラムを実行する前に行わなければならない。このオプションの複数の出現を指定することができます。

ざっくりOPERANDS

awk programfile

ざっくりまとめ

awkは行区切りで表示されるデータの一部の値を取得したいときや使いたいときに非常に便利なコマンドですね。-F だけでも覚えておけば、日々の業務を楽にできる可能性があります。

$cat sample.csv
1,dog,200
2,cat,300
3,bird,50
4,cow,400
5,rabbit,200

$cat sample.csv | awk -F ',' '{ print $2 }'
dog
cat
bird
cow
rabbit

2番目のフィールの動物の名前を取得した。

上記例の通り、CSVなど特定の区切り文字が利用されているデータにはもってこいじゃないでしょうか。

そしてawkは奥が深いのでさらに深く知りたい人は、

sed & awkプログラミング 改訂版 (A nutshell handbook)

sed & awkプログラミング 改訂版 (A nutshell handbook)

これを買いましょう。

POSIX1日1コマンド[part5]: at

mokicks.hatenablog.com

詳細はこちらの記事へ。1日1POSIXコマンドを実行してみようというやつです。

at

at

とりあえず使ってみる

$ sudo yum install at

$ sudo systemctl status atd
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2018-02-25 23:50:07 UTC; 22s ago
 Main PID: 3314 (atd)
   CGroup: /system.slice/atd.service
           └─3314 /usr/sbin/atd -f

Feb 25 23:50:07 localhost.localdomain systemd[1]: Started Job spooling tools.
Feb 25 23:50:07 localhost.localdomain systemd[1]: Starting Job spooling tools...

起動していなければ、

$ sudo systemctl start atd
$ touch dummy-file1 dummy-file2
$ ls
dummy-file1  dummy-file2

$ echo 'rm dummy-file2' > at_task

$ date
Sun Feb 25 23:56:50 UTC 2018
$ ls
at_task  dummy-file1  dummy-file2

$ at -f at_task 23:58
job 4 at Sun Feb 25 23:58:00 2018

$ date
Sun Feb 25 23:57:21 UTC 2018
$ ls
at_task  dummy-file1  dummy-file2

$ date
Sun Feb 25 23:58:03 UTC 2018
$ ls
at_task  dummy-file1
#dummy-file2が消えている

atで指定した時間にコマンドを実行した。

at を知る

ざっくりDESCRIPTION

後でコマンドを実行する。標準入力からコマンドを読み取り、後で実行されるat-jobとしてグループ化する。 at-jobは別でのシェルで実行され、制御して無いターミナルのプロセスグループとして分けられる。
環境変数、現在の作業ディレクトリ、ファイル作成マスク、およびatユーティリティが実行されたときに有効になる他のimplementation-definedの実行時間属性は、at-jobが実行されるときに、atユーティリテーは保持され使用されるものとし、実行される。

at-jobがsubmitされると、at_job_idとスケジュールされた時間は、標準エラー出力に書き込まれる。
at_job_idは英数字とピリオドからなる識別子です。
ジョブが特定のジョブを一意に識別するようにスケジュールされている場合、at_job_idはシステムによって割り当てられたものとする。

ざっくり使い方

at [-m] [-f file] [-q queuename] -t time_arg
at -r at_job_id...

ざっくりOPTION

  • -f file

    • 標準入力の代わりに、at-jobのソースとして使用するファイルのパス名を指定する。
  • -l

    • at_job_idが指定されていない場合は、起動するユーザーに対してスケジュールされたすべてのジョブを出力する。 at_job_idsが指定されている場合は、これらのジョブの情報のみを出力する。出力は標準出力に書き込まれます。
  • -m

    • at-jobが実行された後、呼び出し元のユーザーに完了のメールを送信する。at-jobによって生成された標準出力と標準エラーは、他の場所にリダイレクトされ無い限り、同様にユーザーに送られる。
  • -q
  • -r
  • -t

ざっくりOPERANDS

  • at_job_id
    • 前回atユーティティーでジョブをスケジュールしたときに出力された名前
  • timespec
    • 多かったので割愛しますが、実行する時間の設定方法が本家サイトには載っています。

ざっくりまとめ

  • cronで定期実行しているやつの一回バージョン。queをつくれそうな感じかしますね。
  • yumでインストールした。標準では入って無い
  • atd (おそらくat daemon)を起動していないと実行できない。

POSIX1日1コマンド[part4]: asa

mokicks.hatenablog.com

詳細はこちらの記事へ。1日1POSIXコマンドを実行してみようというやつです。

asa

asa

asa を知る

ざっくりDESCRIPTION

キャリッジコントロール文字を解析する。(?)
入力ファイルを標準出力に出力し、テキストファイルからキャリッジコントロール文字を処理系定義の方法で、ラインプリンター制御シーケンスにマッピングする。
全ての行の最初の文字が削除され、以下の処理が実行される

削除された文字

  • スペース
    • 残りの行はそのまま出力される
  • 0
    • 改行が出力され、残りの行も出力される
  • 1
    • 処理系定義文字が次のページに進むために出力され、残りの入力行が続く
  • +
    • 前の行の改行は、一つ以上のの処理系定義文字をプリントし、列の位置を一つ戻り、残りのの入力が続く。+が最初の文字の場合はスーペースと同じ処理になる。

キャリッジコントロール文字とは?

carriage-control characters がわからなかったので調べてみた。

単純に「キャリッジコントロール」で調べてもでてこない。だが、改行コードの話はでてくる。

キャリッジ・リターン(carriage return)は本来、テレタイプ端末の Baudot Code における制御文字を指す用語で、行末から行頭に戻す復帰コードであって、改行コードを含まない。その後、タイプライターで一行打ち込んだ後で紙を固定するシリンダー(キャリッジ)を次の行の先頭にタイプできるように戻し(リターン)改行する機構(またはその機構を操作するレバー)を「キャリッジ・リターン」と呼んだ。

キャリッジコントロール文字はおそらく、文字の復帰等を制御する文字だと仮定した。

改行コード - Wikipedia

ラインプリンター制御シーケンスとは?

line-printer control sequences (ラインプリンター制御シーケンス)も分からなかったので調べてみた。

そもそもラインプリンターとは

kotobank.jp

行印字装置だそう。

ラインプリターを制御するシーケンスということでしょう。

ざっくり使い方

asa <file>

ざっくりOPTION

オプションは無い

ざっくりOPERANDS

asa <file>

ファイルが指定されていない場合は標準入力が使用される。

ざっくりまとめ

おそらく、ラインプリンターを使うときに使うコマンドだと思います。 自分の環境で試そうとしたところ、

[vagrant@localhost 003]$ asa
-bash: asa: command not found

となりました。 ラインプリターが統合されているUNIXマシンではasaコマンドが使えるのでしょうか。

詳しい方もしこの記事を見つけたら教えてください.

POSIX1日1コマンド[part3]: ar

mokicks.hatenablog.com

詳細はこちらの記事へ。1日1POSIXコマンドを実行してみようというやつです。

ar

ar

使い方がよくわからなかった上に英語がつらくなったのでこちらも参考にさせていただいた。
オプションは後日追記予定 Man page of ar

ar を知る

ざっくりDESCRIPTION

ライブラリのアーカイブの作成と管理をするコマンド。Software Development Utilitiesのオプションの一つ。
アーカイブにまとめられたファイルのグループを作成、管理する。アーカイブが作成されると、新しいファイルを追加したり、アーカイブ内のすでに存在するファイルを抽出したり、消したり、置き換えたりできる。

ざっくりOPTION

後日追加

ざっくりOPERANDS

$ ar <archive>

アーカイブのパス名

$ ar <file>

パス名。アーカイブ内のファイル名と比較する場合は、最後のコンポーネントのみを使用する。 2つ以上のファイルオペランドが同じ最終パス名コンポーネント(basename)を持つ場合、結果は未指定()です。インプレメンテーションズアーカイブフォーマットは、アーカイブに追加または置換されたファイルの有効なファイル名を切り捨ててはならない。

ざっくり使ってみる

$ ar -s hoge
ar: hoge: File format not recognized

ファイル形式が認識されない

$ ar 
Usage: ar ...
...
ar: supported targets: elf64-x86-64 elf32-i386 elf32-x86-64 a.out-i386-linux pei-i386 pei-x86-64 elf64-l1om elf64-k1om elf64-little elf64-big elf32-little elf32-big plugin srec symbolsrec verilog tekhex binary ihex

サポートされているのは以下の形式のファイルのよう

うむ。elfってのをざっくりわかるぐらい。
上記に記載した日本語のmanページのリンクでも書いているが、対象はバイナリファイルのよう。

ざっくりまとめ

ほぼ、使い方がわからなかった。実際使うことも少なそう。tarというコマンドがあるが、関係があるのだろうか。 継続2日目

POSIX1日1コマンド[part2]: alias

mokicks.hatenablog.com

詳細はこちらの記事へ。1日1POSIXコマンドを実行してみようというやつです。

alias

alias

aliasを知る

ざっくりDESCRIPTION

エイリアス(別名)を定義するコマンド。また、定義されたエイリアスを標準出力に出力する。エイリアスは現在のシェルとサブシェルに影響を与える。

ざっくりOPTION

オプションは無い

ざっくりOPERANDS

$ alias alias-name

指定したalias-name別名の定義を標準出力に出力する

$ alias egrep
alias egrep='egrep --color=auto'
$ alias alias-name=string

指定したalias-nameに別名を定義する

$ alias hoge="echo 'hoge'"
$ hoge
hoge

ざっくりまとめ

エイリアスは一般的にもよく使われていますね。 継続1日目

さぁPOSIXを始めよう

こんにちはー

久しぶりの投稿になります..

たまにはてなブログのアクセス数を見たりしてましたが、記事を書くには至りませんでした。(何を言っても言い訳になりそう)

だいたい1日20〜30アクセスはあるようです。もっとPVを増やすとやる気も出てくるのでは??
と思い、seoあげてみるか!とか考えてました!!

が本日は逆行します。

本題

POSIXという言葉を聞いたことはあるでしょうか?

POSIX - Wikipedia

とりあえずウィキペディアのリンクを貼っておきます。

POSIX(ポシックス、ポジックス、英: Portable operating system interface)は、各種UNIXを始めとする異なるオペレーティングシステム (OS) 実装に共通のアプリケーションプログラミングインタフェース (API) を定め、移植性の高いアプリケーションソフトウェアの開発を容易にすることを目的としてIEEEが策定したAPI規格である。

超ハイパーざっくりとした僕の認識は

  • どこの環境でも動く

です。

以前に「恐怖!シェルショッカーのPOSIX原理主義 シェルスクリプト」というスライドを見たことがあって、受けた印象です。

www.slideshare.net

(是非見てみてください)

移植性が高いに越したことはないですよね。
名著の「UNIXという考え方-その設計思想と哲学」でも

UNIXという考え方―その設計思想と哲学

UNIXという考え方―その設計思想と哲学

「効率より移植性」

という定理が書かれています。
(是非読んでください)

#!/bin/sh

と書いていながら

lrwxrwxrwx.   1 root root         4 Oct 28 11:03 sh -> bash

こういうことありますよね。
ここでは動いているのに、僕の環境じゃ動かない!

というのをなるべく個人レベルでも無くしていきたいので、最近はPOSIX準拠したコマンドを使うようにしています。(配列とかもそうですね)

なるべくとかではなく、sh で動くものを作るようにしています。

POSIXコマンドチートシートをQitaで作成してしている方がいたので、こちらも参考にさせていただいています。

qiita.com

今後の取り組み

POSIX準拠かどうかを調べる方法はいくつかあります。 ですが、そもそもPOSXI準拠のコマンドを知っていないと、何かを作るときに遠回りになる可能性があります。

そこで、私は、1日1shコマンドを心がけて生活していきたいと思います!!

参考にするところはこちらのリンク

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/contents.html

ここに記載されているコマンドを1日一つできれば、それなりのPOSIX成長を見込めるのではないでしょうか。

1日一つコマンドを使ってみて、使い方を理解する、活用方法を考える。的な感じでできればと思っています。

まとめ

半年ぐらい記事更新をさぼっていたやつが1日1記事更新するのはおそらく無理なので、各コマンドについて記事を更新するかは闇の中ですが、
できるだけ!できるだけ!やっていこうと思います。

追記

当初は

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/contents.html

のページの上から行っていこうと思ったのですが、序盤の方は
Special Built-In Utilities(break, continue等)だったので、そっちの方は時間をじっくりやるべきだと思い、1日1回実行するのは
Utilitiesの方にすることにしました。

Utilities

アーカイブ

mokicks.hatenablog.com

mokicks.hatenablog.com

mokicks.hatenablog.com

mokicks.hatenablog.com

mokicks.hatenablog.com

mokicks.hatenablog.com

mokicks.hatenablog.com

mokicks.hatenablog.com

mokicks.hatenablog.com

mokicks.hatenablog.com

mokicks.hatenablog.com

PythonのTrue,False小メモ

Pythonの真偽値として使われるbool型に関するメモ

https://docs.python.jp/3/library/numbers.html#numbers.Integral

常識なのかもしれないが、bool型は整数型の派生型とのこと

boolクラスのインスタンスとしてしか考えたことがなかった

>>> True
True
>>> type(True)
<class 'bool'>

整数型の派生なので演算ができる

>>> True + 1
2
>>> True + True
2

おまけ

>>> True == True + True
False

真実に真実を加えると、真実じゃなくなる