3

我有这样的字符串

/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

等等..我想将字符串'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 提供任何输出。

4

5 回答 5

7

有许多问题,但让我们隔离问题并一次解决一个问题。

给定- 原始字符串:

/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并将输出保存到stdout该子shell中的变量parsed
  • awk 'BEGIN{FS=OFS="/"}- 调用awk和设置分隔符作为/输入和输出。
  • {print $6, $7}'- 根据原始字符串的格式,您要打印第 6 个(audicerttest)和第 7 个(传入)字段。
  • <<< ${string}是使用herestring的表示法
  • input_file.txt > parsed_vars.txt- 从指定的输入文件读取,并将输出重定向到输出文件。
于 2012-11-29T20:37:32.037 回答
2

这是一个纯粹的 bash 解决方案,不使用任何矫枉过正awk,不使用任何邪恶eval,也不使用任何子外壳:

你有这个字符串:

string="/home/rm/home-scripts/originals/audicerttest/incoming/TEST040511.txt"

/您需要一个字符串,其中包含变量中的第 5 和第 6 个字段(其中分隔为) parsed。我们走吧:

IFS=/ a=( $string ) printf -v parsed '%s/%s' "${a[@]:5:2}"
于 2012-11-29T20:59:02.020 回答
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
于 2012-11-29T20:35:43.673 回答
1

仅使用 bash 数组,您可以执行以下操作:

假设:

path=/home/rm/home-scripts/originals/audicerttest/incoming/TEST040511.txt

然后:

IFS=/ split=(${path})
path_part="${split[5]}/${split[6]}"

$split将是一个数组,元素 0 为空,元素一home,元素 2rm等。这样,您只需连接想要获得您喜欢的部分的元素。

于 2012-11-29T20:59:21.430 回答
0

没有人建议使用简单的参数扩展来操作字符串。我假设前 4 个目录是不变的

while read path; do
    dirname=$(dirname $path)
    abc=${dirname#/home/rm/home-scripts/originals/}
    echo "abc===$abc"
done < filename
于 2012-11-30T01:29:48.230 回答