この質問の続き:コマンド出力の最初の列を解析し、対応する2番目の列の値を取得します。 以下のようにテーブル形式で文字列を出力するコマンドがあるとします。私が探している「パターン」にスペースが含まれている場合はどうなりますか?たとえば、テーブルが次のような場合:
First Characteristic: b
Second Characteristic: 89.4
Version: 58.93
Name of Device: myDevice
Name of Device Load: myDevice-load-123abc
上記の表の「デバイスロード名」の横にある値を取得するにはどうすればよいですか?
明確にすると、私が探している値が「デバイスロード名」の横にあることがわかります。出力の5行目にあるかもしれませんが、その値がどのように見えるかもしれません(たとえば、「-load-」などのパターンマッチを試すことはできません)。
答え1
これはどうですか?
grep "Name of Device Load:" your_file.txt| cut -d ":" -f 2 | tr -d " "
これにより、関心のある行のみを保持し、それらを2つのフィールドに分割し(各行が:
一度だけ発生する場合にのみ機能します)、スペースを削除します。
答え2
私はこれを使用しますperl
。
このような:
#!/usr/bin/env perl
use strict;
use warnings;
local $/;
my %lookup = ( <> =~ m/^(.*): (\S+)$/gm );
print $lookup{'Name of Device Load'},"\n";
私達はまたはファイル名からデータを「読みます」STDIN
。 (myscript.pl filename
それはすべてです<>
。少し魔法です。)
上記の正規表現キャプチャグループを使用してこれを「解析」し、一度に2つの要素をキャプチャし(フラグによって複数行にわたってキャプチャを繰り返す)、キーと値のペアのハッシュgm
テーブルを作成します。
その後、名前付きキーに関連する値を抽出してName of Device Load
印刷するので、順序は重要ではありません。
答え3
私はそれを達成するためにawk -F":"を使用します。したがって、2番目の列が必要な場合はこれを行うことができます。
awk -F":" 'FNR == 5 {print $2}'
これは一時的な解決策ですが、この場合は機能します。
知っていて、必要なパターンが「デバイスロード名」の場合は、次のことができます。
cat file.txt | grep "Name of Device Load" | awk -F":" '{print $2}'
編集:5行目と2行目と検索パターンのオプションが追加されました。基本的にすべてはこのアイデアに基づいています。
https://stackoverflow.com/questions/1506521/select-row-and-element-in-awk
答え4
次のスクリプトを使用すると、2番目の値を取得できます
awk -F: /デバイスロード名:/ { $2 印刷} file1