我有这样的字符串
/home/rm/home-scripts/originals/audicerttest/incoming/TEST040511.txt
/home/rm/home-scripts/originals/audicerttest2/incoming/TEST040512.txt
/home/rm/home-scripts/originals/audicerttest3/incoming/TEST040513.txt
etc ..我想将字符串'audicerttest / incoming',audicerttest2 / incoming'等提取到shell变量中,稍后在脚本中使用它。我试过这样的事情。
for file in `find ${ROOT}/* -type f | grep -v -f test.txt`
do
let count++
echo ${count}: ${file}
echo ${file} | eval $(awk '{split($0,a,"/"); print "abc=a[6]/a[7]"}' < /dev/null)
echo abc====$abc
done
但它没有为abc提供任何输出。
答案 0 :(得分:6)
存在许多问题,但让我们隔离问题并一次解决一个问题。
给定 - 原始字符串:
/home/rm/home-scripts/originals/audicerttest/incoming/TEST040511.txt
所需输出 - 您希望将此部分保存在变量中:
audicerttest/incoming
操作方法 - 这样做:
string="/home/rm/home-scripts/originals/audicerttest/incoming/TEST040511.txt"
parsed=$(awk 'BEGIN{FS=OFS="/"} {print $6, $7}' <<< ${string})
通常,假设您有一个名为input_file.txt
的文件:
/home/rm/home-scripts/originals/audicerttest/incoming/TEST040511.txt
/home/rm/home-scripts/originals/audicerttest2/incoming/TEST040512.txt
/home/rm/home-scripts/originals/audicerttest3/incoming/TEST040513.txt
你可以这样做:
awk 'BEGIN{FS=OFS="/"} {print $6, $7}' input_file.txt > parsed_vars.txt
parsed_vars.txt
将包含:
audicerttest/incoming
audicerttest2/incoming
audicerttest3/incoming
一些解释:
parsed=$(...)
- 生成子shell并将输出保存到该子shell中的stdout
变量parsed
awk 'BEGIN{FS=OFS="/"}
- 调用awk
并为输入和输出设置分隔符/
。{print $6, $7}'
- 根据原始字符串的格式,您要打印第6个(audicerttest)和第7个(传入)字段。 <<< ${string}
是使用herestring input_file.txt > parsed_vars.txt
- 从指定的输入文件中读取,并将输出重定向到输出文件。答案 1 :(得分:1)
echo ${file} | eval $(awk '{split($0,a,"/"); print "abc=a[6]/a[7]"}' < /dev/null)
好的,这里有几个问题。
awk
正在从/dev/null
读取,这没有任何意义,猜测您要处理文件名:
echo {$file} | awk ...
"a[6]"
是字符串a[6]
,没有替换。
现在评估整个事情:
eval $(echo $file | awk '{split($0,a,"/"); print "abc="a[6]"/"a[7]""}')
最后,eval是邪恶的,为什么不直接设置变量?
abc=$(echo $file | awk '{split($0,a,"/"); print a[6]"/"a[7]}')
就个人而言,我更清楚一点:
cut -d / --output-delimiter / -f6,7
答案 2 :(得分:1)
这是一个纯粹的bash解决方案,不使用任何过度杀伤awk
而不使用任何邪恶的eval
而不使用任何子shell:
你有这个字符串:
string="/home/rm/home-scripts/originals/audicerttest/incoming/TEST040511.txt"
您需要一个字符串,其中包含变量/
中的第5个和第6个字段(其中分隔为parsed
)。我们走吧:
IFS=/ a=( $string ) printf -v parsed '%s/%s' "${a[@]:5:2}"
答案 3 :(得分:1)
只有bash数组,您可以执行以下操作:
假设:
path=/home/rm/home-scripts/originals/audicerttest/incoming/TEST040511.txt
然后:
IFS=/ split=(${path})
path_part="${split[5]}/${split[6]}"
$split
将是一个数组,元素0为空,元素一home
,元素2 rm
等等。有了它你只需要连接你想要的元素部分你喜欢。
答案 4 :(得分:0)
没有人建议简单parameter expansion来操纵字符串。我假设前4个目录是常量
while read path; do
dirname=$(dirname $path)
abc=${dirname#/home/rm/home-scripts/originals/}
echo "abc===$abc"
done < filename