如何从特定单词后面的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
只是添加一个选项,请记住只有一种模式可以匹配斜杠之间的三个字符,即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:如果字段等于“数据”,则打印下一个字段