シェルスクリプトのテーブルからユーザーログイン名と一致するIDを抽出します。

シェルスクリプトのテーブルからユーザーログイン名と一致するIDを抽出します。

ここに画像の説明を入力してください。だから私はこれらのすべてのユーザーログイン(service、admin、J009878)を持っていて、ここに表示されているこのテーブルは他のコマンドからのもので、その出力は私がfile.txtに保存したこのテーブルです。私が達成したいのは、file.txtファイル(テーブルがある場所)を見つけて、ログイン情報と一致するIDを抽出できることです。ログイン情報(J009878、admin、またはそのいずれかである可能性があります)は$ user変数の形式で提供され、その変数と一致するIDを抽出するために使用する必要があります。

たとえば、私の変数ユーザーがログインまたはID J665454を取得した場合、そこからID 23を抽出できるようにしたいと思います。同様に、ログイン名がadminの場合は、ID 4を抽出して変数に保存する必要があります。

どんな助けでも大変感謝します。ありがとうございます!

ベストアンサー1

$personログイン名が保存されていると仮定すると、次のGNU sedコマンドを使用してこれを達成できます。

sed -En "s_\s*\|([0-9]+)\s*\|\s*$person\s*\|.+_\1_p"

例:

❯ set person Jack

❯ cat table.txt | sed -En "s_\s*\|([0-9]+)\s*\|\s*$person\s*\|.+_\1_p"
4

❯ set person David

❯ sed -En "s_\s*\|([0-9]+)\s*\|\s*$person\s*\|.+_\1_p" table.txt # also works
32

説明する:

sed -E -n: -E は拡張正規表現フラグを設定し、 -n は明示的に指示しない限り sed が印刷しないようにします。

s_<regex>_<replacement>_psは代替コマンドです(_どんな文字でも可能です。_読みやすくするために選択しました)。正規表現と一致して代替式に置き換えます。最後のものはpそれを印刷し、私たちが使用したので-n一致する行だけを印刷します。

\s*\|([0-9]+)\s*\|\s*$person\s*\|.+: 式の正規表現部分で、次のように記述されます。

正規表現 重要性
\s*\| これは任意の数のスペース(テーブルがスペースで始まる場合)と一致し、次にリテラルと一致します|。正規表現では特別な意味を持つ|ので脱出します。|
([0-9]+) これは0から9の範囲の1つ以上の文字と一致します。ほとんどの正規表現エンジンでは\dこの機能を使用できますが、サポートされていませsed\d。式の周りの括弧は、置換で参照するために使用できる「グループ」に入れます\1-9。たとえば、echo "hello" | sed "s_([aeiou])/\1\1_g"will generate はheelloo各コレクションが2つのコピーに置き換えられるためです(gフラグを使用すると、1行に複数回動作します)。
\s*\|\s* 任意のスペース(スペースなしを含む)、テキスト、|任意のスペース(スペースなしを含む)の順です。
$person この部分はシェルに置き換えられ、sedはこれを見ることができないため、スクリプトが呼び出されると一致するJack文字またはその他の項目で終わります。$person
\s*\| 必要な数のスペース(スペースなしを含む)とtextを一致させて、探しているログインが一致しないことを確認する必要があります|JackieJack
.+ これは行末までのすべての項目と一致します。交換を実行すると、一致しないすべてのアイテムがまだ印刷されるため、行全体が一致することを確認する必要があるため、これは重要です。

\1:正規表現が一致するもの(全体を減らしてください)を、私たちが探しているID番号のグループ1に置き換えます。これにより、行全体がそのID番号のみを保持するため、その行が印刷されます。

おすすめ記事