Rav*_*avi 3 unix bash shell awk
我有这样的字符串
/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
Run Code Online (Sandbox Code Playgroud)
etc..I我想将字符串'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
Run Code Online (Sandbox Code Playgroud)
但它没有为abc提供任何输出.
有许多问题,但让我们隔离问题并一次解决一个问题.
给定 - 原始字符串:
/home/rm/home-scripts/originals/audicerttest/incoming/TEST040511.txt
Run Code Online (Sandbox Code Playgroud)
期望的输出 - 您希望将此部分保存在变量中:
audicerttest/incoming
Run Code Online (Sandbox Code Playgroud)
方法 - 这样做:
string="/home/rm/home-scripts/originals/audicerttest/incoming/TEST040511.txt"
parsed=$(awk 'BEGIN{FS=OFS="/"} {print $6, $7}' <<< ${string})
Run Code Online (Sandbox Code Playgroud)
通常,假设您有一个名为的文件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
Run Code Online (Sandbox Code Playgroud)
你可以做:
awk 'BEGIN{FS=OFS="/"} {print $6, $7}' input_file.txt > parsed_vars.txt
Run Code Online (Sandbox Code Playgroud)
而parsed_vars.txt将包含:
audicerttest/incoming
audicerttest2/incoming
audicerttest3/incoming
Run Code Online (Sandbox Code Playgroud)
一些解释:
parsed=$(...)- 生成子shell并将输出保存stdout到变量的子shell中parsedawk 'BEGIN{FS=OFS="/"}- 为输入和输出调用awk和设置分隔符/.{print $6, $7}' - 根据原始字符串的格式,您要打印第6个(audicerttest)和第7个(传入)字段. <<< ${string}是使用herestring的表示法input_file.txt > parsed_vars.txt - 从指定的输入文件中读取,并将输出重定向到输出文件.