awkや他の方法を使用するのに役立ちますか?
入力ファイルには次の内容が含まれています。
PROD 192.168.100.25 Unix Active
PROD 192.168.100.26 Unix - Server Active
DEV 192.168.100.27 windows Gateway Active
TEST 192.168.100.28 Unix Test Server Not Active
PROD 192.168.100.29 windows mail gateway Active down
PROD 192.168.100.30 Unix Active down
今awkを使用して列2と4を取得します。以下を参照してください。
awk '{print $2 $4}' Inputfile
結果 -
192.168.100.25 Active
192.168.100.26 -
192.168.100.27 Gateway
192.168.100.28 Test
192.168.100.29 mail
192.168.100.30 Active
予想される結果 -
192.168.100.25 Active
192.168.100.26 Active
192.168.100.27 Active
192.168.100.28 Not Active
192.168.100.29 Active down
192.168.100.30 Active down
答え1
デフォルトでは、AWK のフィールドはスペースで区切られます。空白がどれだけ多いかは関係ありませんので、次のファイルは同じ結果を提供します。
PROD 192.168.100.25 Unix Active
PROD 192.168.100.26 Unix - Server Active
この2行の4番目のフィールドは明らかにActive
sumです-
。
これで、ファイル形式は実際には次のようになります。フィールドはタブで区切られ、その間にはスペースのみが含まれます。 SEに公開した後、タブは保持されないと思われます。
そうすれば、線はより似ているように見えます。
PROD<tab>192.168.100.26<tab>Unix - Server<tab><tab>Active
次のようにタブを区切り文字として使用するようにAWKに指示できます。
$ awk -F '\t+' '{print $2, $4}' file.txt
192.168.100.25 Active
192.168.100.26 Active
しかし、各フィールドの間にタブを置く方が一般的です。つまり、可変長データとうまく合わない。それからawk -F '\t'
。
列が実際に固定幅の場合は、次を使用してcut
必要な部分を選択できます。ただし、この場合は文字を手動で計算する必要があります。
1 2 3 4 5 6 7
1234567890123456789012345678901234567890123456789012345678901234567890
PROD 192.168.100.29 windows mail gateway Active down
上記の数で判断すると、次のように動作できます。
$ cut -c8-23,52-70 file-fixed.txt
192.168.100.25 Active
192.168.100.26 Active
192.168.100.27 Active
192.168.100.28 Not Active
192.168.100.29 Active down
192.168.100.30 Active down
少なくとも、GNU AWKは固定幅フィールドもサポートしていますが、これについては深く調査していません。バラよりhttps://www.gnu.org/software/gawk/manual/html_node/Fixed-width-data.html
答え2
まず、awkは、ユーザーが要求した操作を実行していることを明確にします。デフォルトではフィールドを区切ります。スペース、関心のある列にはスペース文字を含めることができるため、各スペースはawkの新しいフィールドを表します。
2つのランダムな文字列入力がある場合は、Linuxコマンドを使用してフィールドを解析してから分離するのは困難ですcolumn
。私の経験では、Pythonなどのより強力なプログラミング言語を呼び出す方が良いです。私はPython CSVライブラリに固定幅フィールドの形式を推論するツールがあると思います。
「アクティブ」「非アクティブ」「下」オプションのみを使用するように最後のフィールドを変更できる場合は、以下を使用できます。
awk '{ print $2 $NF }' Inputfile
$NF
これは「フィールド数」を意味し、最後のフィールドを選択するのと同じです。
ただし、データの最後の列にはスペースが含まれる場合と含まれない場合があり、この構文が壊れます。
または、他の人が指摘したように、フィールドがタブで区切られている場合は、次のものを使用できます。
awk -F $'\t' '{ print $2 $4 }' Inputfile
フラグは、タブ文字であるフィールド区切り-F
文字を指定します。$'\t'
ただし、項目が次のような場合いいえタブで区切られているため、このデータ型に関連する操作を実行する必要があるかもしれません。異なる形式の入力ファイルがある場合は、エラーが表示されることがあります。
以下は、すべてのインスタンスを使用する例です。複数フィールド区切り文字として使用される空白文字:
awk -F ' {2,}' '{ print $2 $NF }' Inputfile
この場合、フィールド区切り文字は正規表現です。これは、「複数の空白文字で構成されるインスタンス」と同じです。
これは、提供された例では機能しますが、最初または最後のフィールド以外のフィールドが必要な場合は、列3に複数のスペースが含まれている場合でも問題が発生する可能性があります。
答え3
この場合、awkを使用するには、まず「Not Active」と「Active down」のスペースを別の文字に置き換えます。
sed 's/Not Active/Not_Active/g ; s/Active down/Active_down/g' inputfile
次に、awkを使用して2番目と最後のフィールドを抽出します。
awk '{print $2,$NF}'
最後に、次のスペースを復元します。
sed 's/_//g'
これらすべてをまとめると、最終的なコマンドは次のようになります。
sed 's/Not Active/Not_Active/g ; s/inputfile down/Active_down/g' active | awk '{print $2,$NF}' | sed 's/_/ /g'