この記事は約6分41秒で読むことができます。

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'/>

Leave a Reply

Your email address will not be published. Required fields are marked *