web-dev-qa-db-ja.com

grep / cutコマンドを使用して特定の単語/数字を出力する

ファイルtest.txtがあり、次の結果が含まれています。

service_name1= Apple/ball/cat/dog/Egg/12.34.56/ball/Apple
service_name2= fan/girl/house/ice/joker/23.45.67/fan/girl

などservice_name1500まで

次のような出力が必要です:

Egg 12.34.56
joker 23.45.67

など:バージョン番号とその前のWord。

7
Donald

これは単純なcutジョブである必要があります。

cut -d/ -f5,6 --output-delimiter=" "
  • -d/は、入力区切り文字を/として設定します
  • -f5,6は、5番目と6番目のフィールドのみを出力します
  • --output-delimiter=" "は、出力区切り文字をスペースとして設定します

awkawkについても同じことがデフォルトで出力フィールドの区切りをスペースとして設定します。

awk -F/ '{print $5,$6}'

例:

% cat file.txt
service_name1= Apple/ball/cat/dog/Egg/12.34.56/ball/Apple
service_name2= fan/girl/house/ice/joker/23.45.67/fan/girl

% cut -d/ -f5,6 --output-delimiter=" " file.txt
Egg 12.34.56
joker 23.45.67

% awk -F/ '{print $5,$6}' file.txt
Egg 12.34.56 
joker 23.45.67
10
heemayl

sedソリューション(バージョン文字列のフィールド位置が一貫しているかどうかにかかわらず機能しますが、バージョン文字列の形式は一貫している必要があります)

$ sed -r 's#.*/(.*)/([0-9]{2}\.[0-9]{2}\.[0-9]{2}).*#\1 \2#' test.txt
Egg 12.34.56

joker 23.45.67

説明

  • -r EREを使用するので、()メタキャラクターをエスケープする必要はありません
  • s#old#new#パターンoldを検索し、newに置き換えます
  • .*は、この位置の文字に一致するか、文字なしに一致します
  • (stuff)後で覚えるstuff
  • [0-9]{2}\.[0-9]{2}\.[0-9]{2} [2桁]。[2桁]。[2桁]のパターン
  • \1 \2間にスペースがある2つの記憶されたパターン
8
Zanna

これはそれを行います:

cut -d'/' -f5-6 test.txt | tr -s "/" " "
5
Soren A

Wordの固定位置を扱う場合、これは機能します。

grep -e 'service_name[0-9]*=' test.txt|awk -F'/' '{ print $5" "$6 }'
3
0x0C4
$sed -r 's/.*\/([[:alpha:]]+)\/([\.0-9]*)\/.*/\1 \2/' test.txt

説明:

  • .*の先頭と末尾は、次と一致しないすべての文字をカットします
  • ([[:alpha:]]+)括弧内の最初のサブグループはアルファベット文字のみに一致します
  • \/は、切り取られるスラッシュと一致します
  • 次のサブグループ([\.0-9]*)は、数字とポイントに一致し、2番目のレジスタに格納します
  • 単一のスラッシュ/の後に\1 \2で置換すると、一致したサブグループから最初と2番目のレジスタが挿入されます
2
SeDav

長いが動作しているpythonワンライナー:

$ python -c "import sys;print '\n'.join([ ' '.join(l.strip().split('/')[4:6]) for l in sys.stdin])" < input.txt          
Egg 12.34.56
joker 23.45.67

使い方:

  • <を含む入力ファイルをPythonのstdinストリームにリダイレクトします
  • リスト内包表記[item for item in sequence]を使用して、stdinを1行ずつ読み取ります
  • .split()は、/をセパレータとして使用して、行を単語のリストに分解します
  • 単語4と5を抽出し([4:6]は最後の数字が含まれないことを意味します)、' '.join()を使用して文字列を作成します
  • 必要な文字列のリストを作成し、'\n'.join()を使用してそれらを行に変換し、すべて出力します
1