特定の単語の後に続くCSV行から文字列をキャプチャする方法

特定の単語の後に続くCSV行から文字列をキャプチャする方法

特定の単語の後に続くCSV行から文字列をキャプチャする方法

たとえば、これは次の文字列を切り取りたいCSV行です。/data/

status=true /data/sdb/hadoop/hdfs/log,/data/sdc/hadoop/hdfs/log,/data/sdd/hadoop/hdfs/log,/data/sde/hadoop/hdfs/log,/data/sdf/hadoop/hdfs/log

予想結果の例

sdb
sdc
sdd
sde
sdf

答え1

使用grep:

PCREの使用:

grep -Po '/data/\K[^/]*'

利用できない場合:

grep -o '/data/[^/]*' | cut -d'/' -f3

答え2

@pLumoは間違いなく正しい答えを持っています。何らかの理由でawkbashの組み込みパラメータ拡張を使用したいのですが、少し複雑な場合は...

LINE_COUNTER=0
while read line; do
    COUNT_SEP="${line//[^,]}"
    for col in $(seq 2 $((${#COUNT_SEP}+1))); do
        LINE_COUNTER=$(($LINE_COUNTER+1))
        COLUMN=$(echo "${line}" | awk -v variable="${col}" -F, '{ print $variable }')
        if [ $LINE_COUNTER -eq 1 ]
        then
            echo "${COLUMN}" > /tmp/splitCSV
        else
            echo "${COLUMN}" >> /tmp/splitCSV
        fi
    done
    while read splitCol; do
        echo "${splitCol}" | awk -F'/data/' '{ print $2 }' | awk -F'/' '{ print $1 }'
    done < /tmp/splitCSV
done < test.csv

答え3

オプションを追加するには、スラッシュ間の3つの文字を一致させることができるパターンは1つだけであることを覚えておいてsedくださいgrep

grep -o "/.../"  foo | sed 's;/;;g' file

出力:

sdb
sdc
sdd
sde
sdf

答え4

これはawkで動作します。

awk -F'/' '{for(i=1;i<=NF;i++) if($i=="data") print $(i+1)}' <file>

1:-Fはフィールド区切り文字を/として定義します。

2: 各行の各フィールドを繰り返します。

3:フィールドが「data」と等しい場合は、次のフィールドを印刷します。

関連情報