2012-11-29 37 views
2

我有這樣指定一個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 

etc..I字符串要提取字符串「audicerttest /來電」,audicerttest2 /入」等成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的輸出。

回答

5

有一些問題,但讓我們找出問題並解決他們一次一個。

鑑於 - 原始字符串:

/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=$(...) - 生成一個子外殼和子外殼內的輸出到stdout保存到變量parsed
  • awk 'BEGIN{FS=OFS="/"} - 調用awk和分隔符設定爲/用於輸入和輸出。
  • {print $6, $7}' - 基於原始字符串的格式,您希望打印第6個(audicerttest)和第7個(傳入)字段。
  • <<< ${string}是用於使用herestring
  • input_file.txt > parsed_vars.txt符號 - 從指定的輸入文件中讀取,並輸出重定向到一個輸出文件中。
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整個事情:

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 
+0

你方法的主要問題是無用的'eval'。 'eval'是邪惡的!不提無用的subhells使用。 –

+0

我剛剛更新了我的答案......他正在使用效率低下的工具來完成任務,但是(我希望)他問的是爲什麼它不起作用,而不僅僅是要求其他解決方案。所以,不知道爲什麼downvote。 –

+0

我是Shell的總新手。我同意有太多的錯誤。感謝您糾正這些問題。 – Ravi

1

這裏是一個純bash的解決方案,不使用任何矯枉過正awk並沒有使用任何邪惡eval並沒有使用任何子shell:

你有這樣的字符串:

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

你想要一個字符串包含變量parsed中的第5個和第6個字段(其中的間隔爲/)。讓我們去:

IFS=/ a=($string) printf -v parsed '%s/%s' "${a[@]:5:2}" 
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,等等。你只需要連接你想獲得你喜歡的部分的元素。

0

沒有人建議簡單的parameter expansion來操縱字符串。我假設前4個目錄是不變的

while read path; do 
    dirname=$(dirname $path) 
    abc=${dirname#/home/rm/home-scripts/originals/} 
    echo "abc===$abc" 
done < filename