特定の単語の後に続く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は間違いなく正しい答えを持っています。何らかの理由でawk
bashの組み込みパラメータ拡張を使用したいのですが、少し複雑な場合は...
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」と等しい場合は、次のフィールドを印刷します。