2013-04-16 32 views
22

ホスト名がaaa0.bbb.cccの場合、.の前に最初の部分文字列、つまりaaa0を抽出します。スクリプトは、一台のマシンA生成aaa0上で稼働しているマシンB上で実行している間、私はAwkを使用して部分文字列を抽出する

echo aaa0.bbb.ccc | awk '{if (match($0, /\./)) {print substr($0, 0, RSTART - 1)}}' 

、そうするために、以下のawkスクリプトを使用して、最後に0せず、唯一のaaa生成します。どちらのマシンはUbuntu/Linaroを実行しますが、AWKのA実行新しいバージョン(Bながら、バージョン1.2と古いAWK(のmawkとバージョン3.1.8とgawkは)

私が実行する互換性のawkスクリプトを作成する方法を、一般的に求めています同じ機能...

答えて

47
あなただけ -Fオプションを使用して .としてフィールドセパレータを設定し、最初のフィールド印刷したい

$ echo aaa0.bbb.ccc | awk -F'.' '{print $1}' 
aaa0 

同じことが、使用してカット:

$ echo aaa0.bbb.ccc | cut -d'.' -f1 
aaa0 

またはsedと:

$ echo aaa0.bbb.ccc | sed 's/[.].*//' 
aaa0 

でもgrep

$ echo aaa0.bbb.ccc | grep -o '^[^.]*' 
aaa0 
4

それともカットを使用:あなたはこのためにAWKを必要としない

echo aaa0.bbb.ccc | cut -d'.' -f1 
0

を...

echo aaa0.bbb.ccc | cut -d. -f1 
cut -d. -f1 <<< aaa0.bbb.ccc 

echo aaa0.bbb.ccc | { IFS=. read a _ ; echo $a ; } 
{ IFS=. read a _ ; echo $a ; } <<< aaa0.bbb.ccc 

x=aaa0.bbb.ccc; echo ${x/.*/} 

重いオプション:

sed: 
echo aaa0.bbb.ccc | sed 's/\..*//' 
sed 's/\..*//' <<< aaa0.bbb.ccc 
awk: 
echo aaa0.bbb.ccc | awk -F. '{print $1}' 
awk -F. '{print $1}' <<< aaa0.bbb.ccc 
+0

Downvoter、間違いを知らせてください。ありがとう:) – anishsane

1

あなただけのbashでパラメータ展開を使用して、まったくの外部コマンドは必要ありません。

hostname=aaa0.bbb.ccc 
echo ${hostname%%.*} 
4

を私が書く方法を、一般的に求めています が同じ機能を実行する互換性のあるawkスクリプト...

Toあなたのquesitonの問題を解決するのは簡単です。 (他者の回答を確認する)。

awkスクリプトを作成したい場合は、awkの実装とバージョンに移植可能です(gawk/nawk/mawk ...一部のawkは文字の面で文字列に取り組んでいます

  • 、バイトの一部
  • いくつかのサポート\x脱出、いくつか:)それがたとえ--posix(gawkの)例えば

    とは、本当に難しいですない

  • FSインタプリタは異なり
  • キーワード/予約語の略語制限
  • いくつかのオペレータの制限などの作品**
  • 同じawk impl。 (例えばgawk)、バージョン4.0と3.xでも違いがあります。
  • 特定の機能の実装も異なります。 (あなたの問題は一例で、下記を参照してください)

上記のすべての点は、一般的に話されています。あなたの問題に戻って、問題はawkの基本的な機能にのみ関連しています。 awk '{print $x}'そのような行はすべてのawksを動かすでしょう。誤って

  • ご使用substr()機能:

    は、あなたのawkのラインは、gawkのとのmawkに異なる動作を二つの理由があります。これが主な原因です。 substr($0, 0, RSTART - 1)0はでなければなりません。どちらのawkを使用しても問題ありません。 awk配列、文字列idxなどは1ベースです。

  • gawkとmawkはsubstr()と異なって実装されています。

関連する問題