generate-script.awkなるものを読んで思った所感

参考文献

 

参考にしたコマンド

上田さんのシェルこうそく開発手法にopenコマンド出て来て、それはmacだったので、linuxだとxdg-openにあたるぽい。徐にソースコードを落として適当に漁った。面白くて楽しい本!第2版も買いたいんだよなー。

フルスクラッチから1日でCMSを作る シェルスクリプト高速開発手法入門  
コード表示

[oracle@centos scripts]$ xdg-open --version
xdg-open 1.1.0 rc1
[oracle@centos scripts]$ yum provides xdg-open | grep -B 4 "$(which xdg-open)"
xdg-utils-1.1.0-0.17.20120809git.el7.noarch : Basic desktop integration
                                            : functions
リポジトリー        : base
一致          :
ファイル名    : /usr/bin/xdg-open
--
xdg-utils-1.1.0-0.17.20120809git.el7.noarch : Basic desktop integration
                                            : functions
リポジトリー        : @anaconda
一致          :
ファイル名    : /usr/bin/xdg-open

ソースコードダウンロード

こういうのは規格とか調べないと汎用的なものは作れなそう

コード表示

[oracle@centos src]$ cat install.sh
#!/bin/bash

sudo yumdownloader --source xdg-utils-1.1.0-0.17.20120809git.el7.noarch

rpmdev-extract xdg-utils-1.1.0-0.17.20120809git.el7.src.rpm

cd xdg-utils-1.1.0-0.17.20120809git.el7.src

tar -xvf xdg-utils-1.1.0-20120809git.tar.gz

適当にファイル用意した

外部ファイルをgetlineでパス指定して読み込むんかーと。マークをsedで削除しちゃっているけど。ちなみにANKOはあんこじゃない。あんこの絵文字ない。

コード表示

[oracle@centos awk]$ ll ANKO UNKO gen.awk exclude.sed in out
-rwxr-xr-x. 1 oracle docker  72  7月 14 10:20 ANKO
-rwxr-xr-x. 1 oracle docker  72  7月 14 10:20 UNKO
-rw-r--r--. 1 oracle docker  16  7月 14 10:30 exclude.sed
-rwxr-xr-x. 1 oracle docker 172  7月 14 10:19 gen.awk
-rwxr-xr-x. 1 oracle docker  60  7月 14 10:24 in
-rw-r--r--. 1 oracle docker 194  7月 14 10:33 out
[oracle@centos awk]$ cat ANKO
for i in $(yes "$(echo -ne '\U1F194')" | head -n 5);do echo -ne $i;done
[oracle@centos awk]$ cat UNKO
for i in $(yes "$(echo -ne '\U1F4A9')" | head -n 5);do echo -ne $i;done
[oracle@centos awk]$ cat exclude.sed
/UNKO/d
/ANKO/d
[oracle@centos awk]$ cat gen.awk
#!/usr/local/bin/awk

{
  print
}

/UNKO/{
  while (getline < "./UNKO")
    print
  close ("./UNKO")
}

/ANKO/{
  while (getline < "./ANKO")
    print
  close ("./ANKO")
}
[oracle@centos awk]$ cat in
#!/bin/bash

unko(){
UNKO
}

anko(){
ANKO
}

unko
anko
echo
[oracle@centos awk]$ cat out
#!/bin/bash

unko(){
for i in $(yes "$(echo -ne '\U1F4A9')" | head -n 5);do echo -ne $i;done
}

anko(){
for i in $(yes "$(echo -ne '\U1F194')" | head -n 5);do echo -ne $i;done
}

unko
anko
echo

実行

いろいろごったに。三位一体感ある。teeでoutファイルを生成しつつ、結果を標準出力にだす。これはdebugしやすそう。


[oracle@centos awk]$ awk -f gen.awk in | sed -f exclude.sed | tee out | bash
💩💩💩💩💩🆔🆔🆔🆔🆔
[oracle@centos awk]$ ./out
bash: ./out: 許可がありません
[oracle@centos awk]$ chmod +x ./out
[oracle@centos awk]$ ./out
💩💩💩💩💩🆔🆔🆔🆔🆔

所感

切り出すと、どこに何かいたか把握するのたいへんなんだよな。ただ、それも楽しい。

gawk 5.0.0いんすこ

参考文献

configure, make, make install とは何か  
【 which 】コマンド――実行コマンドのフルパスを表示する  
GNU awk 5.0.0がリリース - 名前空間が実装されたメジャーバージョンアップ版  
https://qiita.com/ryuichi1208/items/fe625fba0afe0ec46789  
Gawk 5.0.0 released!  

実行例

コード表示

[oracle@centos rr]$ gawk --version | head -n 1
GNU Awk 4.0.2
[oracle@centos ff]$ ll
合計 0
[oracle@centos ff]$ curl -LO ftp://ftp.gnu.org/gnu/gawk/gawk-5.0.0.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 5628k  100 5628k    0     0   222k      0  0:00:25  0:00:25 --:--:--  303k
[oracle@centos ff]$ ll
合計 5632
-rw-r--r--. 1 oracle docker 5763496  6月 23 13:45 gawk-5.0.0.tar.gz
[oracle@centos ff]$ tar -zxvf gawk-5.0.0.tar.gz
[oracle@centos ff]$ ll
合計 5636
drwxr-xr-x. 15 oracle docker    4096  4月 12 18:31 gawk-5.0.0
-rw-r--r--.  1 oracle docker 5763496  6月 23 13:45 gawk-5.0.0.tar.gz
[oracle@centos ff]$ cd gawk-5.0.0/
[oracle@centos gawk-5.0.0]$ pwd
/home/oracle/ff/gawk-5.0.0
[oracle@centos gawk-5.0.0]$ ll | grep conf
-rwxr-xr-x. 1 oracle docker  47840  4月 11 03:29 config.guess
-rwxr-xr-x. 1 oracle docker  18574  4月 11 03:29 config.rpath
-rwxr-xr-x. 1 oracle docker  31589  4月 11 03:29 config.sub
-rw-r--r--. 1 oracle docker  13627  4月 12 18:03 configh.in
-rwxr-xr-x. 1 oracle docker 375070  4月 12 18:03 configure
-rw-r--r--. 1 oracle docker  12818  4月 12 18:02 configure.ac

[oracle@centos gawk-5.0.0]$ ./configure
[oracle@centos gawk-5.0.0]$ make
[oracle@centos gawk-5.0.0]$ ll
合計 9684
-rw-r--r--. 1 oracle docker   94012  4月  5 16:37 ABOUT-NLS
-rw-r--r--. 1 oracle docker     495 12月 15  2017 AUTHORS
-rw-r--r--. 1 oracle docker   35147 12月 15  2017 COPYING
-rw-r--r--. 1 oracle docker     298  4月 12 18:19 ChangeLog
-rw-r--r--. 1 oracle docker  378804  4月  5 16:38 ChangeLog.0
-rw-r--r--. 1 oracle docker   15752 12月 24 05:01 INSTALL
-rw-r--r--. 1 oracle docker   42397  6月 23 13:48 Makefile
-rw-r--r--. 1 oracle docker    5841  4月  5 16:38 Makefile.am
-rw-r--r--. 1 oracle docker   43725  4月 12 18:03 Makefile.in
-rw-r--r--. 1 oracle docker    2039  4月  8 03:53 NEWS
-rw-r--r--. 1 oracle docker   85116 12月 15  2017 NEWS.0
-rw-r--r--. 1 oracle docker   18602  4月  5 16:38 NEWS.1
-rw-r--r--. 1 oracle docker    1980 12月 24 05:01 POSIX.STD
-rw-r--r--. 1 oracle docker    3852  4月 12 17:59 README
drwxr-xr-x. 2 oracle docker    4096  4月 12 18:18 README_d
-rw-r--r--. 1 oracle docker    4705  4月  5 16:38 TODO
-rw-r--r--. 1 oracle docker   42419  4月 12 18:03 aclocal.m4
-rw-r--r--. 1 oracle docker   32676  4月  5 16:38 array.c
-rw-r--r--. 1 oracle docker  137216  6月 23 13:50 array.o
-rw-r--r--. 1 oracle docker   60231  4月 11 04:06 awk.h
-rw-r--r--. 1 oracle docker  261884  4月 12 18:02 awkgram.c
-rw-r--r--. 1 oracle docker  489048  6月 23 13:50 awkgram.o
-rw-r--r--. 1 oracle docker  165324  4月  9 03:49 awkgram.y
drwxr-xr-x. 4 oracle docker    4096  6月 23 13:50 awklib
-rw-r--r--. 1 oracle docker  100458  4月  5 16:38 builtin.c
-rw-r--r--. 1 oracle docker  519832  6月 23 13:50 builtin.o
-rw-r--r--. 1 oracle docker   28915  4月  5 16:38 cint_array.c
-rw-r--r--. 1 oracle docker  103608  6月 23 13:50 cint_array.o
-rw-r--r--. 1 oracle docker    5589  4月  5 16:37 cmd.h
-rw-r--r--. 1 oracle docker  101640  4月 12 18:02 command.c
-rw-r--r--. 1 oracle docker  153760  6月 23 13:50 command.o
-rw-r--r--. 1 oracle docker   39774  4月  5 16:38 command.y
-rwxr-xr-x. 1 oracle docker    7383  4月 11 03:29 compile
-rwxr-xr-x. 1 oracle docker   47840  4月 11 03:29 config.guess
-rw-r--r--. 1 oracle docker   14345  6月 23 13:48 config.h
-rw-r--r--. 1 oracle docker  132076  6月 23 13:48 config.log
-rwxr-xr-x. 1 oracle docker   18574  4月 11 03:29 config.rpath
-rwxr-xr-x. 1 oracle docker   43287  6月 23 13:48 config.status
-rwxr-xr-x. 1 oracle docker   31589  4月 11 03:29 config.sub
-rw-r--r--. 1 oracle docker   13627  4月 12 18:03 configh.in
-rwxr-xr-x. 1 oracle docker  375070  4月 12 18:03 configure
-rw-r--r--. 1 oracle docker   12818  4月 12 18:02 configure.ac
-rw-r--r--. 1 oracle docker    2355  4月  5 16:38 custom.h
-rw-r--r--. 1 oracle docker  142002  4月  5 16:38 debug.c
-rw-r--r--. 1 oracle docker  593376  6月 23 13:50 debug.o
-rwxr-xr-x. 1 oracle docker   23568  4月 11 03:29 depcomp
drwxr-xr-x. 3 oracle docker    4096  6月 23 13:48 doc
-rw-r--r--. 1 oracle docker   43584  4月  8 03:53 eval.c
-rw-r--r--. 1 oracle docker  449304  6月 23 13:50 eval.o
-rw-r--r--. 1 oracle docker    6983  4月  5 16:38 ext.c
-rw-r--r--. 1 oracle docker   52184  6月 23 13:50 ext.o
drwxr-xr-x. 7 oracle docker    4096  6月 23 13:50 extension
drwxr-xr-x. 2 oracle docker    4096  6月 23 13:48 extras
-rw-r--r--. 1 oracle docker   43912  4月  5 16:38 field.c
-rw-r--r--. 1 oracle docker  149752  6月 23 13:50 field.o
-rw-r--r--. 1 oracle docker    3457  4月  5 16:29 floatcomp.c
-rw-r--r--. 1 oracle docker   19976  6月 23 13:50 floatcomp.o
-rw-r--r--. 1 oracle docker    1873  4月  5 16:29 floatmagic.h
-rwxr-xr-x. 1 oracle docker 2583080  6月 23 13:50 gawk
-rw-r--r--. 1 oracle docker   35948  4月  5 16:38 gawkapi.c
-rw-r--r--. 1 oracle docker   40486  4月  5 16:38 gawkapi.h
-rw-r--r--. 1 oracle docker  134312  6月 23 13:50 gawkapi.o
-rw-r--r--. 1 oracle docker    1397  4月  5 16:37 gawkmisc.c
-rw-r--r--. 1 oracle docker   37544  6月 23 13:50 gawkmisc.o
-rw-r--r--. 1 oracle docker   10478  4月  5 16:37 gettext.h
-rwxr-xr-x. 1 oracle docker   15368  4月 11 03:29 install-sh
-rw-r--r--. 1 oracle docker   20750  4月  5 16:38 int_array.c
-rw-r--r--. 1 oracle docker   76472  6月 23 13:50 int_array.o
-rw-r--r--. 1 oracle docker   36205  4月  5 16:38 interpret.h
-rw-r--r--. 1 oracle docker  112095  4月  5 16:37 io.c
-rw-r--r--. 1 oracle docker  286528  6月 23 13:50 io.o
drwxr-xr-x. 2 oracle docker    4096  4月 12 18:23 m4
-rw-r--r--. 1 oracle docker   47396  4月  8 03:53 main.c
-rw-r--r--. 1 oracle docker  188640  6月 23 13:50 main.o
-rw-r--r--. 1 oracle docker    1678  4月  5 16:37 mbsupport.h
-rwxr-xr-x. 1 oracle docker    6872 12月 24 05:01 missing
drwxr-xr-x. 2 oracle docker    4096  4月 12 18:23 missing_d
-rwxr-xr-x. 1 oracle docker    3539  4月 11 03:29 mkinstalldirs
-rw-r--r--. 1 oracle docker   39262  4月  5 16:38 mpfr.c
-rw-r--r--. 1 oracle docker   19512  6月 23 13:50 mpfr.o
-rw-r--r--. 1 oracle docker    4130  4月  5 16:37 msg.c
-rw-r--r--. 1 oracle docker   31480  6月 23 13:50 msg.o
-rw-r--r--. 1 oracle docker   24798  4月  5 16:37 node.c
-rw-r--r--. 1 oracle docker   96816  6月 23 13:50 node.o
-rw-r--r--. 1 oracle docker    2988  4月  5 16:38 nonposix.h
drwxr-xr-x. 3 oracle docker    4096  4月 12 18:23 pc
drwxr-xr-x. 2 oracle docker    4096  6月 23 13:48 po
drwxr-xr-x. 2 oracle docker    4096  4月 12 18:25 posix
-rw-r--r--. 1 oracle docker   50514  4月  5 16:38 profile.c
-rw-r--r--. 1 oracle docker  218040  6月 23 13:50 profile.o
-rw-r--r--. 1 oracle docker    4385  4月  5 16:37 protos.h
-rw-r--r--. 1 oracle docker   16272  4月  5 16:38 re.c
-rw-r--r--. 1 oracle docker   70624  6月 23 13:50 re.o
-rw-r--r--. 1 oracle docker    2879  4月  5 16:38 replace.c
-rw-r--r--. 1 oracle docker   18496  6月 23 13:50 replace.o
-rw-r--r--. 1 oracle docker      23  6月 23 13:48 stamp-h1
-rw-r--r--. 1 oracle docker   20166  4月 11 04:06 str_array.c
-rw-r--r--. 1 oracle docker   70824  6月 23 13:50 str_array.o
drwxr-xr-x. 3 oracle docker    4096  6月 23 13:50 support
-rw-r--r--. 1 oracle docker   20703  4月  5 16:38 symbol.c
-rw-r--r--. 1 oracle docker   90808  6月 23 13:50 symbol.o
drwxr-xr-x. 5 oracle docker   36864  6月 23 13:48 test
-rw-r--r--. 1 oracle docker      66  7月 19  2018 version.c
-rw-r--r--. 1 oracle docker    2408  6月 23 13:50 version.o
drwxr-xr-x. 3 oracle docker    4096  4月 12 18:22 vms
-rwxr-xr-x. 1 oracle docker    6858 12月 24 05:01 ylwrap


[oracle@centos gawk-5.0.0]$ make install
Making install in support
make[1]: ディレクトリ `/home/oracle/ff/gawk-5.0.0/support' に入ります
make[2]: ディレクトリ `/home/oracle/ff/gawk-5.0.0/support' に入ります
make[2]: `install-exec-am' に対して行うべき事はありません.
make[2]: `install-data-am' に対して行うべき事はありません.
make[2]: ディレクトリ `/home/oracle/ff/gawk-5.0.0/support' から出ます
make[1]: ディレクトリ `/home/oracle/ff/gawk-5.0.0/support' から出ます
Making install in .
make[1]: ディレクトリ `/home/oracle/ff/gawk-5.0.0' に入ります
make[2]: ディレクトリ `/home/oracle/ff/gawk-5.0.0' に入ります
 /usr/bin/mkdir -p '/usr/local/bin'
  ./install-sh -c gawk '/usr/local/bin'
cp: 通常ファイル `/usr/local/bin/_inst.5085_' を作成できません: 許可がありません
make[2]: *** [install-binPROGRAMS] エラー 1
make[2]: ディレクトリ `/home/oracle/ff/gawk-5.0.0' から出ます
make[1]: *** [install-am] エラー 2
make[1]: ディレクトリ `/home/oracle/ff/gawk-5.0.0' から出ます
make: *** [install-recursive] エラー 1


[oracle@centos gawk-5.0.0]$ sudo make install

[oracle@centos gawk-5.0.0]$ which gawk
/usr/local/bin/gawk
[oracle@centos gawk-5.0.0]$ /usr/local/bin/gawk --version
GNU Awk 5.0.0, API: 2.0
Copyright (C) 1989, 1991-2019 Free Software Foundation.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/.

[oracle@centos gawk-5.0.0]$ ./gawk --version
GNU Awk 5.0.0, API: 2.0
Copyright (C) 1989, 1991-2019 Free Software Foundation.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/.

~/.bashrcぐらいに実行ファイルまでのエイリアス名付けておく

docにしかバージョン文言ないから嫌。あっ、だからシンボリックリンクの概念生まれたのか。。。コピーしてリネームしておけばいいのか!!

コード表示

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions

alias unkommit="/usr/local/bin/unkommit.sh"
alias awk="/usr/local/bin/awk"
alias gawk="/usr/local/bin/awk"

[oracle@centos ~]$ cd /usr/local/bin/
[oracle@centos bin]$ ll
合計 20828
lrwxrwxrwx. 1 root root        4  6月 23 13:51 awk -> gawk
-rwxr-xr-x. 1 root root 16154160  5月 12 17:20 docker-compose
-rwxr-xr-x. 2 root root  2583080  6月 23 13:51 gawk
-rwxr-xr-x. 2 root root  2583080  6月 23 13:51 gawk-5.0.0
-rwxr-xr-x. 1 root root       34  4月  5 05:57 sqldeveloper
lrwxrwxrwx. 1 root root       32  6月 22 14:06 unkommit.sh -> /home/oracle/rr/.bin/unkommit.sh
[oracle@centos bin]$ echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/oracle/.local/bin:/home/oracle/bin
[oracle@centos bin]$ ll
合計 20828
lrwxrwxrwx. 1 root root        4  6月 23 13:51 awk -> gawk
-rwxr-xr-x. 1 root root 16154160  5月 12 17:20 docker-compose
-rwxr-xr-x. 2 root root  2583080  6月 23 13:51 gawk
-rwxr-xr-x. 2 root root  2583080  6月 23 13:51 gawk-5.0.0
-rwxr-xr-x. 1 root root       34  4月  5 05:57 sqldeveloper
lrwxrwxrwx. 1 root root       32  6月 22 14:06 unkommit.sh -> /home/oracle/rr/.bin/unkommit.sh
[oracle@centos bin]$ pwd
/usr/local/bin
[oracle@centos bin]$ echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/oracle/.local/bin:/home/oracle/bin
[oracle@centos bin]$ pwd
/usr/local/bin
[oracle@centos bin]$ ll
合計 20828
lrwxrwxrwx. 1 root root        4  6月 23 13:51 awk -> gawk
-rwxr-xr-x. 1 root root 16154160  5月 12 17:20 docker-compose
-rwxr-xr-x. 2 root root  2583080  6月 23 13:51 gawk
-rwxr-xr-x. 2 root root  2583080  6月 23 13:51 gawk-5.0.0
-rwxr-xr-x. 1 root root       34  4月  5 05:57 sqldeveloper
lrwxrwxrwx. 1 root root       32  6月 22 14:06 unkommit.sh -> /home/oracle/rr/.bin/unkommit.sh
[oracle@centos bin]$ which awk
alias awk='/usr/local/bin/awk'
	/usr/local/bin/awk
[oracle@centos bin]$ which gawk
alias gawk='/usr/local/bin/awk'
	/usr/local/bin/awk

awkでbashファンクション作成

結果のイメージ

コード表示

[oracle@centos pp]$ ll
合計 20
-rw-r--r--. 1 oracle docker   35  6月  7 06:57 clr
drwxr-xr-x. 2 oracle docker 4096  6月  7 07:57 const
-rw-r--r--. 1 oracle docker  310  6月  7 07:57 def_bg_func.sh
-rw-r--r--. 1 oracle docker  310  6月  7 07:57 def_fg_func.sh
-rwxr-xr-x. 1 oracle docker  646  6月  7 07:56 mkfunc.sh
[oracle@centos pp]$ tree
.
├── clr
├── const
│   ├── def_clr_bg.sh
│   └── def_clr_fg.sh
├── def_bg_func.sh
├── def_fg_func.sh
└── mkfunc.sh

1 directory, 6 files
[oracle@centos pp]$ cat def_bg_func.sh
#!/bin/bash
source ./const/*;
red(){
  echo -e "${BG_RED}$*${NORMAL}";
}
green(){
  echo -e "${BG_GREEN}$*${NORMAL}";
}
yellow(){
  echo -e "${BG_YELLOW}$*${NORMAL}";
}
blue(){
  echo -e "${BG_BLUE}$*${NORMAL}";
}
magenta(){
  echo -e "${BG_MAGENTA}$*${NORMAL}";
}
cyan(){
  echo -e "${BG_CYAN}$*${NORMAL}";
}
[oracle@centos pp]$ cat def_fg_func.sh
#!/bin/bash
source ./const/*;
red(){
  echo -e "${FG_RED}$*${NORMAL}";
}
green(){
  echo -e "${FG_GREEN}$*${NORMAL}";
}
yellow(){
  echo -e "${FG_YELLOW}$*${NORMAL}";
}
blue(){
  echo -e "${FG_BLUE}$*${NORMAL}";
}
magenta(){
  echo -e "${FG_MAGENTA}$*${NORMAL}";
}
cyan(){
  echo -e "${FG_CYAN}$*${NORMAL}";
}

mkfunc.sh

コード表示

[oracle@centos pp]$ cat ./mkfunc.sh
#!/bin/bash
flg=$1
fnm=$2
while read line;do
  rn=$(echo ${line} | sed -e 's/ .*//');
  func_name=$(echo ${line} | sed -e 's/.* //');
  const_name=$(echo ${func_name^^});
  echo " "| awk '
  BEGIN{
    FLG="'${flg}'"
  }
  {
    RN="'${rn}'"
    if(RN == "1"){
      print "#!/bin/bash"
      print "source ./const/*;"
    }
    FUNC_NAME="'${func_name}'"
    CONST_NAME="'FG_${const_name}'"
    if(FLG == "bg"){
      CONST_NAME="'BG_${const_name}'"
    }
    print FUNC_NAME"\x28\x29\x7b\x0a\x20\x20""echo -e ""\x22""${"CONST_NAME"}""\x24\x2a""${NORMAL}""\x22\x3b\x0a\x7d"
  }'
done < <(cat clr | nl) >${fnm}

あとがき

もうちょい工夫したいけど時間ないから、fin!!!

libvirt管理のネットワークを固定ipにするためのhostタグを第3オクテットを指定して作ってみた話

まえがき

awk便利だよなー

def_ip.awk

コード表示

[root@centos vx]# cat def_ip.awk
{
  gsub(/[^ ]+/,"\x5c\x27&\x5c\x27");
  print "<host mac="$2" name="$1" ip=\x5c\x27""192.168."third_octet"."NR+1"\x5c\x27""/>"
}

split_@ファイル

グルーピング後のファイルを対象に実行してみるよ

コード表示

[root@centos vx]# ll split*
-rw-r--r--. 1 root root 48  6月  2 15:32 split_0
-rw-r--r--. 1 root root 48  6月  2 15:32 split_1
-rw-r--r--. 1 root root 48  6月  2 15:32 split_2
[root@centos vx]# seq 0 2 | xargs -t -I@ bash -c 'cat split_@'
bash -c cat split_0 
node1 52:54:00:5d:4a:3f
node2 52:54:00:dc:5b:1b
bash -c cat split_1 
node3 52:54:00:77:33:99
node4 52:54:00:61:72:67
bash -c cat split_2 
node5 52:54:00:88:c2:54
node6 52:54:00:a8:bc:df

実行

第3オクテット100の時と、200の時で実行してみるよ。シングルクォートはエスケープしておく。後続処理のため。

コード表示

[root@centos vx]# seq 0 2 | xargs -I@ bash -c 'gawk -v "third_octet=$((@+100))" -f def_ip.awk split_@'
<host mac=\'52:54:00:5d:4a:3f\' name=\'node1\' ip=\'192.168.100.2\'/>
<host mac=\'52:54:00:dc:5b:1b\' name=\'node2\' ip=\'192.168.100.3\'/>
<host mac=\'52:54:00:77:33:99\' name=\'node3\' ip=\'192.168.101.2\'/>
<host mac=\'52:54:00:61:72:67\' name=\'node4\' ip=\'192.168.101.3\'/>
<host mac=\'52:54:00:88:c2:54\' name=\'node5\' ip=\'192.168.102.2\'/>
<host mac=\'52:54:00:a8:bc:df\' name=\'node6\' ip=\'192.168.102.3\'/>
[root@centos vx]# seq 0 2 | xargs -I@ bash -c 'gawk -v "third_octet=$((@+200))" -f def_ip.awk split_@'
<host mac=\'52:54:00:5d:4a:3f\' name=\'node1\' ip=\'192.168.200.2\'/>
<host mac=\'52:54:00:dc:5b:1b\' name=\'node2\' ip=\'192.168.200.3\'/>
<host mac=\'52:54:00:77:33:99\' name=\'node3\' ip=\'192.168.201.2\'/>
<host mac=\'52:54:00:61:72:67\' name=\'node4\' ip=\'192.168.201.3\'/>
<host mac=\'52:54:00:88:c2:54\' name=\'node5\' ip=\'192.168.202.2\'/>
<host mac=\'52:54:00:a8:bc:df\' name=\'node6\' ip=\'192.168.202.3\'/>
[root@centos vx]# seq 0 2 | xargs -I@ bash -c 'gawk -v "third_octet=$((@+100))" -f def_ip.awk split_@ >def_host_tag_$((@+100))'
[root@centos vx]# ll def_host*
-rw-r--r--. 1 root root 140  6月  2 15:54 def_host_tag_100
-rw-r--r--. 1 root root 140  6月  2 15:54 def_host_tag_101
-rw-r--r--. 1 root root 140  6月  2 15:54 def_host_tag_102
[root@centos vx]# seq 0 2 | xargs -t -I@ bash -c 'cat def_host_tag_$((@+100))'
bash -c cat def_host_tag_$((0+100)) 
<host mac=\'52:54:00:5d:4a:3f\' name=\'node1\' ip=\'192.168.100.2\'/>
<host mac=\'52:54:00:dc:5b:1b\' name=\'node2\' ip=\'192.168.100.3\'/>
bash -c cat def_host_tag_$((1+100)) 
<host mac=\'52:54:00:77:33:99\' name=\'node3\' ip=\'192.168.101.2\'/>
<host mac=\'52:54:00:61:72:67\' name=\'node4\' ip=\'192.168.101.3\'/>
bash -c cat def_host_tag_$((2+100)) 
<host mac=\'52:54:00:88:c2:54\' name=\'node5\' ip=\'192.168.102.2\'/>
<host mac=\'52:54:00:a8:bc:df\' name=\'node6\' ip=\'192.168.102.3\'/>

あとがき

いいかんじだぁ

ファイルをグルーピングして分割する話

まえがき

awk便利だよな

参考文献

クロス集計をBash(とawk)だけで実装した話  

grp.sh

コード表示

[root@centos vx]# cat grp.sh
#!/bin/bash
grp(){
  RN=$1
  GRP=$2
  while read line;do
     echo ${line} | sed -e s/GRP/${GRP}/ | bash;
  done < <(seq ${RN} | xargs -I@ bash -c 'echo echo $\(\(@%GRP\)\)') | sort >grp
}

grp $1 $2

6行を3等分

コード表示

[root@centos vx]# ./grp.sh 6 3
[root@centos vx]# cat grp
0
0
1
1
2
2

対象ファイルをgrpに従い分割

対象ファイルはvminfo。$1でグルーピング単位を指定できるらしい。便利!

コード表示

[root@centos vx]# paste -d ' ' grp vminfo | awk '{print>"split_"$1}'
[root@centos vx]# ll split*
-rw-r--r--. 1 root root 52  6月  2 15:21 split_0
-rw-r--r--. 1 root root 52  6月  2 15:21 split_1
-rw-r--r--. 1 root root 52  6月  2 15:21 split_2
[root@centos vx]# cat vminfo
node1 52:54:00:5d:4a:3f
node2 52:54:00:dc:5b:1b
node3 52:54:00:77:33:99
node4 52:54:00:61:72:67
node5 52:54:00:88:c2:54
node6 52:54:00:a8:bc:df
[root@centos vx]# seq 0 2 | xargs -t -I@ bash -c 'cat split_@'
bash -c cat split_0 
0 node1 52:54:00:5d:4a:3f
0 node2 52:54:00:dc:5b:1b
bash -c cat split_1 
1 node3 52:54:00:77:33:99
1 node4 52:54:00:61:72:67
bash -c cat split_2 
2 node5 52:54:00:88:c2:54
2 node6 52:54:00:a8:bc:df
[root@centos vx]# seq 0 2 | xargs -t -I@ bash -c 'cat split_@' | awk '{print $2" "$3>"split_"$1}'
[root@centos vx]# seq 0 2 | xargs -t -I@ bash -c 'cat split_@'
bash -c cat split_0 
node1 52:54:00:5d:4a:3f
node2 52:54:00:dc:5b:1b
bash -c cat split_1 
node3 52:54:00:77:33:99
node4 52:54:00:61:72:67
bash -c cat split_2 
node5 52:54:00:88:c2:54
node6 52:54:00:a8:bc:df

awkで各単語をシングルクォートないしダブルクォートで包む話

参考文献

sed/awkで各文字列をシングルクォーテーション・ダブルクォーテーションで囲む  
awkコマンドへ値を渡す手法のまとめ  

実行例

gsubで半角スペースで始まる文字列以外をパターンキャプチャしてそれをダブクォやシンクォで包む。パタンキャプチャは「&」。16進数のアスキーコードで書くといいのか。

コード表示

[oracle@centos vx]$ cat vminfo
node1 52:54:00:91:02:58
node2 52:54:00:8d:fd:14
node3 52:54:00:cd:fe:3a
[oracle@centos vx]$ awk '{gsub(/[^ ]+/,"\x27&\x27");print}' vminfo
'node1' '52:54:00:91:02:58'
'node2' '52:54:00:8d:fd:14'
'node3' '52:54:00:cd:fe:3a'
[oracle@centos vx]$ awk '{gsub(/[^ ]+/,"\x22&\x22");print}' vminfo
"node1" "52:54:00:91:02:58"
"node2" "52:54:00:8d:fd:14"
"node3" "52:54:00:cd:fe:3a"
[oracle@centos vx]$ awk '{gsub(/[^ ]+/,"\x22&+++&+++&+++&\x22");print}' vminfo
"node1+++node1+++node1+++node1" "52:54:00:91:02:58+++52:54:00:91:02:58+++52:54:00:91:02:58+++52:54:00:91:02:58"
"node2+++node2+++node2+++node2" "52:54:00:8d:fd:14+++52:54:00:8d:fd:14+++52:54:00:8d:fd:14+++52:54:00:8d:fd:14"
"node3+++node3+++node3+++node3" "52:54:00:cd:fe:3a+++52:54:00:cd:fe:3a+++52:54:00:cd:fe:3a+++52:54:00:cd:fe:3a"
[oracle@centos vx]$ awk '{gsub(/[^ ]+/,"&");print}' vminfo
node1 52:54:00:91:02:58
node2 52:54:00:8d:fd:14
node3 52:54:00:cd:fe:3a

応用例

応用してみた。スクリプトにした方が制御しやすそう。

コード表示

[oracle@centos vx]$ awk '{
gsub(/[^ ]+/,"\x27&\x27");
print "<host mac="$2" name="$1" ip=\x27""192.168.@."NR+1"\x27""/>"
}' vminfo
<host mac='52:54:00:91:02:58' name='node1' ip='192.168.@.2'/>
<host mac='52:54:00:8d:fd:14' name='node2' ip='192.168.@.3'/>
<host mac='52:54:00:cd:fe:3a' name='node3' ip='192.168.@.4'/>

awkスクリプトにしてみた

第3オクテット可変にした

コード表示

[oracle@centos vx]$ cat def_ip.awk
{
  gsub(/[^ ]+/,"\x27&\x27");
  print "<host mac="$2" name="$1" ip=\x27""192.168."third_octet"."NR+1"\x27""/>"
}
[oracle@centos vx]$ gawk -v "third_octet=100" -f def_ip.awk vminfo
<host mac='52:54:00:91:02:58' name='node1' ip='192.168.100.2'/>
<host mac='52:54:00:8d:fd:14' name='node2' ip='192.168.100.3'/>
<host mac='52:54:00:cd:fe:3a' name='node3' ip='192.168.100.4'/>

awkの範囲指定演算子を理解したかった話(理解できなかった。)

範囲指定演算子のうごき

内部的にはパタンの真偽を判定している。3になるまでパタンは偽で、3行目以上5行目以下を出力。組込変数NRが5より大きくなったら、偽0にして5より大きい値を出力できないように制御している。とかおもってたけどね。。

コード表示

[root@61eff46d2318 html]# seq 1 10 | awk 'NR==3,NR==5'
3
4
5

sql的には。。。

これを別の切り口で理解したいがために19cr3いんすとした。

コード表示

[oracle@7347fe12d03f ~]$ sqlplus aine/ORACLE_PWD@pdb1

SQL*Plus: Release 19.0.0.0.0 - Production on Wed May 1 22:12:09 2019
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Last Successful login time: Wed May 01 2019 21:56:10 +09:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> select level from dual connect by level <= 10;

     LEVEL
----------
	 1
	 2
	 3
	 4
	 5
	 6
	 7
	 8
	 9
	10

10 rows selected.

SQL> select level as rn,case when level between 3 and 5 then 1 else 0 end as bol from dual connect by level <= 10;

	RN	  BOL
---------- ----------
	 1	    0
	 2	    0
	 3	    1
	 4	    1
	 5	    1
	 6	    0
	 7	    0
	 8	    0
	 9	    0
	10	    0

10 rows selected.
SQL> with sub as ( 
  2  select level as rn,case when level between 3 and 5 then 1 else 0 end as bol from dual connect by level <= 10)select * from sub where bol = 1;

	RN	  BOL
---------- ----------
	 3	    1
	 4	    1
	 5	    1

範囲指定演算子のうごき

内部的にはパタンの真偽を判定している。

コード表示

[root@61eff46d2318 html]# seq 1 10 | awk 'NR%3==0,NR%2==0'
3
4
6
9
10
[root@61eff46d2318 html]# seq 1 10 | awk 'NR%2==0,NR%3==0'
2
3
4
5
6
8
9
10
[root@61eff46d2318 html]# seq 1 10 | awk 'NR%2==0'
2
4
6
8
10
[root@61eff46d2318 html]# seq 1 10 | awk 'NR%3==0'
3
6
9

sql的には。。。

コード表示

SQL> select level as rn
  2  ,case when mod(level,3)=0 then 1 else 0 end as div3
  3  ,case when mod(level,2)=0 then 1 else 0 end as div2
  4  from dual connect by level <= 10;

	RN	 DIV3	    DIV2
---------- ---------- ----------
	 1	    0	       0
	 2	    0	       1
	 3	    1	       0
	 4	    0	       1
	 5	    0	       0
	 6	    1	       1
	 7	    0	       0
	 8	    0	       1
	 9	    1	       0
	10	    0	       1

10 rows selected.

sql的には。。。とかやってみたけど、理解できなかった。

コード表示

SQL> select level as rn
  2  ,case when greatest(2,3)<=level then 1 else 0 end as liner
  3  ,case when mod(level,3)=0 then 1 else 0 end as div3
  4  ,case when mod(level,2)=0 then 1 else 0 end as div2
  5  from dual connect by level <= 10;

	RN	LINER	    DIV3       DIV2
---------- ---------- ---------- ----------
	 1	    0	       0	  0
	 2	    0	       0	  1
	 3	    1	       1	  0
	 4	    1	       0	  1
	 5	    1	       0	  0
	 6	    1	       1	  1
	 7	    1	       0	  0
	 8	    1	       0	  1
	 9	    1	       1	  0
	10	    1	       0	  1

10 rows selected.

コンマ演算子と関係あると思ったけど、

seq 1 10 | awk ‘NR%2==0,NR%3==0’の結果で5が出力されて7が出力されない理由がわかれば、理解できるとは思った。awkってパタン真の奴出力されるんだよね。アクション省略されたら。

この範囲指定演算子は,カンマの前後がスイッチのように働きます.つまり,上記の場合には「組込変数 NR が 10 から組込変数 NR が 20 まで」という意味ではなく,「組込変数 NR が 10 になったらパターンを真にして,組込変数 NR が 20 になったらパターンを偽にする」という意味になるので注意しましょう。

とはあるけど、分からなかった。

ソースコードも見てみたけど分からなかった。なにで検索したらいいか分からなかった。またあとでしらべたい。

コード表示

[root@61eff46d2318 html]# cat /etc/red*
CentOS Linux release 7.6.1810 (Core) 
[root@61eff46d2318 gawk-4.0.2]# rpm -qfi `which awk`
Name        : gawk
Version     : 4.0.2
Release     : 4.el7_3.1
Architecture: x86_64
Install Date: Wed Mar  6 02:34:52 2019
Group       : Applications/Text
Size        : 2435978
License     : GPLv3+ and GPL and LGPLv3+ and LGPL and BSD
Signature   : RSA/SHA256, Thu Jun 29 21:40:38 2017, Key ID 24c6a8a7f4a80eb5
Source RPM  : gawk-4.0.2-4.el7_3.1.src.rpm
Build Date  : Thu Jun 29 06:52:50 2017
Build Host  : c1bm.rdu2.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem 
Vendor      : CentOS
URL         : http://www.gnu.org/software/gawk/gawk.html
Summary     : The GNU version of the awk text processing utility
Description :
The gawk package contains the GNU version of awk, a text processing
utility. Awk interprets a special-purpose programming language to do
quick and easy text pattern matching and reformatting jobs.

Install the gawk package if you need a text processing utility. Gawk is
considered to be a standard Linux tool for processing text.
[root@61eff46d2318 html]# curl -OL http://vault.centos.org/7.6.1810/os/Source/SPackages/gawk-4.0.2-4.el7_3.1.src.rpm
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 2696k  100 2696k    0     0   927k      0  0:00:02  0:00:02 --:--:--  927k
[root@61eff46d2318 html]# ll
total 2700
-rw-r--r--. 1 root root 2761533 May  2 12:11 gawk-4.0.2-4.el7_3.1.src.rpm
[root@61eff46d2318 html]# rpm2cpio *rpm | cpio -id
5388 blocks
[root@61eff46d2318 html]# ll
total 5400
-rw-r--r--. 1 root root 2761533 May  2 12:11 gawk-4.0.2-4.el7_3.1.src.rpm
-rw-rw-r--. 1 root root     583 May  2 12:11 gawk-4.0.2-fix-chksize-calls.patch
-rw-rw-r--. 1 root root 2742713 May  2 12:11 gawk-4.0.2.tar.gz
-rw-rw-r--. 1 root root   14753 May  2 12:11 gawk.spec
[root@61eff46d2318 html]# tar -zxvf gawk-4.0.2.tar.gz
gawk-4.0.2/
gawk-4.0.2/version.in
.
.
.
[root@61eff46d2318 html]# ll
total 5408
drwxrwxr-x. 13 1000 1000    4096 Dec 26  2012 gawk-4.0.2
-rw-r--r--.  1 root root 2761533 May  2 12:11 gawk-4.0.2-4.el7_3.1.src.rpm
-rw-rw-r--.  1 root root     583 May  2 12:11 gawk-4.0.2-fix-chksize-calls.patch
-rw-rw-r--.  1 root root 2742713 May  2 12:11 gawk-4.0.2.tar.gz
-rw-rw-r--.  1 root root   14753 May  2 12:11 gawk.spec
[root@61eff46d2318 gawk-4.0.2]# find . -name "*cnm*"
[root@61eff46d2318 gawk-4.0.2]# find . -name "*comma*"
./test/addcomma.ok
./test/addcomma.awk
./test/addcomma.in
./command.y
./command.c
[root@61eff46d2318 gawk-4.0.2]# find . -name "*ope*"
./vms/vms_popen.c
./pc/popen.c
./pc/popen.h

また戻ってこよう。これにてfin

finしてない。範囲演算子は‖とか&&とか<=,<,>,>=で書いていくのが読みやすいいよなきっと。