SolarisサーバからLinuxサーバへのマイグレーションを行っており、現行サーバ下で運用しているシェルの稼働検証を行っているのですが、
一部のシェルで現行と異なる実行結果が返ってきてしまい、原因調査を行っております。
挙動を確認すると「awkコマンドでパターンに正規表現を使用して抽出を行う」部分で現行と異なる判断が行われているようなのですが、
その原因が「awkコマンド」なのか、「正規表現」の表し方なのか、メタ文字の使い方なのかが分からず、困っております。
(他にも現行環境下で稼働しているシェルスクリプトが多くあり、それらも同様に修正の必要があるのか調査・判断したい)
どなたかお知恵を拝借できないでしょうか。よろしくお願いいたします。
前提・実現したいこと
SolarisとLinuxで挙動が異なった原因を知りたい。
※問題のシェル自体はif文内にカッコ()を追加したことで現行と同様の結果が返ってきたが、その理由が知りたい
(また、他にもSolarisサーバからLinuxサーバへの移管時にシェルスクリプトの修正が発生しうる要素や確認すべき事項があれば。。。)
発生している問題・エラーメッセージ
以下"input.txt"のようなカンマ区切りのデータがあり、2番目の項目("AAAAAAAAAAA ")を読み取って入力値チェックを行いたい。
現行Solarisサーバでは"1"(値セットあり)が返ってくるのだが、新Linuxサーバで実行したところ、"0"(値セットなし)が返ってきた。
※シェル自体は途中で異常終了せず正常に終了している
該当のソースコード
■input.txt
10,AAAAAAAAAAA ,BBBBBBBB ,CCCCCC ,
■hoge.sh
#!/bin/sh (略) CMD=`awk -F, '{ if ( ! $2 ~ /[^ \t ]/ ) { print "0" } else { print "1" } }' < "input.txt"` (略)
■実行結果
0
試したこと
上記シェルのif文中に()を追加したところ、現行と同様の挙動をするようになった。
⇒だが、なぜLinuxではここに()が必要となるのか分からない("!"が条件の否定ではなくメタ文字として扱われてしまっている?)
■hoge-2.sh
#!/bin/sh (略) CMD=`awk -F, '{ if ( ! ($2 ~ /[^ \t ]/) ) { print "0" } else { print "1" } }' < "input.txt"` (略)
■実行結果
1
追記(2021/06/17 15:12)
SolarisサーバとLinuxサーバでawkの処理結果に差異があるのか確認するため、上記hoge.shの問題の条件式の上に以下コマンドを追記して再度実行したところ、両環境で同一の文字列が出力されているため、awkによる文字列抽出の問題ではなく、if文中の"!"の扱いが異なっている?
cat "input.txt" | awk -F, '{print $1}' >> awktest.log cat "input.txt" | awk -F, '{print $2}' >> awktest.log cat "input.txt" | awk -F, '{print $3}' >> awktest.log cat "input.txt" | awk -F, '/[^ \t ]/ {print $2 }' >> awktest.log cat "input.txt" | awk -F, '/[^ \t ]/ {print $3 }' >> awktest.log
■実行結果
10 JHHTTTTTT11 ITRTTT11 JHHTTTTTT11 ITRTTT11
補足情報(FW/ツールのバージョンなど)
■現行 OS:Solaris
Oracle Corporation SunOS 5.11 11.2
/bin/csh
■移行先 OS:Linux
Red Hat Enterprise Linux release 8.2 (Ootpa)
GNU Awk 4.2.1, API: 2.0 (GNU MPFR 3.1.6-p2, GNU MP 6.1.2)
/bin/bash
回答2件
あなたの回答
tips
プレビュー