パスから2番目の要素を抽出する方法は? [コピー]

パスから2番目の要素を抽出する方法は? [コピー]

sedを使用してこれらのパターンをどのように抽出できますか?

これが私の道です:/sample/xyz/logs/test.logs

出力は次のようになります。xyz

たとえば、次のようにパスが変更された場合はどうなりますか?

/example/xyz/log/test.logs?

sedを使用しますか、それともawkを使用しますか?

答え1

私はこれを行う3つの方法を知っています。パスが標準入力に渡されると仮定します。

方法1

echo "/sample/xyz/logs/test.logs" | cut -d / -f 3

これにより、指定された区切り文字を使用して入力が切り捨てられ、必要な-d /xyz部分の3番目のフィールドが選択されます。

方法2

echo "/sample/xyz/logs/test.logs" | awk -F / '{print $3}'

awkは非常に複雑なロジックを書くことができる非常に強力なコマンドです。この単純な形式でこれを使用して、方法1と同じことを実行できます。

方法3

echo "/sample/xyz/logs/test.logs" | sed -r 's/^\/\w+\/(\w+)\/.*/\1/g'

正規表現と共に使用する場合は、sed最初のスラッシュ、後続の単語、および後続のスラッシュを省略できます。 2番目のスラッシュの後の単語を取り、残りを削除します。

ご覧のとおり、これらの方法の複雑さが増加します。

答え2

スクリプトがbash/dash/ksh/zshの場合、外部ツールは不要で、パラメータ置換を介して答えを取得できます。

path=/sample/xyz/logs/test.logs
path=${path#/*/}
echo ${path%%/*}
  • #左から削除してください。
  • %右側から削除してください。
  • 文字を2倍に増やすと、一致が貪欲になります。つまり、できるだけ一致します。

答え3

常にパスの2番目の部分が必要な場合は、次のことを試してください。

echo "/sample/xyz/logs/test.logs" | awk -F/ '{print $3}'

関連情報