특정 단어 뒤에 오는 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: 필드가 "data"와 같으면 다음 필드를 인쇄합니다.