2014-11-06 53 views
0

日誌文件名:"/home/msubra/WORK/tmo/LOG/BCH1043.9987.log"外殼腳本:打印選定的文本中字符串

從上面的字符串,我需要提取內容BCH1043

目錄結構可能會有所不同,因此解決方案應該檢查與BCH字符串,直到點

+2

呃。好。我會先問。你到目前爲止做了什麼?你用什麼工具?你究竟想要做什麼?文件是否始終以BCH開頭並以日誌結尾?請記住,SO是爲了獲得幫助,而不是讓別人爲你做你的工作。 – 2014-11-06 16:24:41

+0

你最後也得到了那個點? – Hackaholic 2014-11-06 16:30:46

回答

0

嘗試這樣的:

a="/home/msubra/WORK/tmo/LOG/BCH1043.9987.log" 
echo ${a##*/} | cut -d "." -f 1 

or 
basename $a | cut -d "." -f 1 

or 
var=${a##*/}; echo ${var%%.*} 

輸出:

BCH1043 

它dosent包括點。你的問題是不明確的,但你可以提取這樣的

${a##*/}最後後將解壓/像相同基名

+0

您的操作順序是倒退的。如果路徑中任何地方出現'.',則失敗。 – 2014-11-06 16:58:44

+0

是的,這隻適用於這個輸入 – Hackaholic 2014-11-06 17:01:35

+0

@EtanReisner現在我認爲它不會失敗 – Hackaholic 2014-11-06 17:21:59

0

basename將減少/home/msubra/WORK/tmo/LOG/BCH1043.9987.log到BCH1043.9987.log

echo /home/msubra/WORK/tmo/LOG/BCH1043.9987.log | basename 

您可以使用正則表達式時,awk,perl的,桑達等來提取 「BCH1043.9987.log」 「BCH1043」。首先,我需要知道可能的文件名的範圍,然後才能爲您提供正則表達式。

0

使用basename來只提取文件名,然後使用參數擴展去掉你不想要的數據。

log=/home/msubra/WORK/tmo/LOG/BCH1043.9987.log 
log=$(basename "$log") 
echo "${log%%.*}" 

以下幾乎等同但不使用外部基本名稱過程。然而,有些情況下會給出不同的結果(儘管這些情況是否與此相關取決於您和您的使用/輸入)。有關示例/詳細信息,請參見this answer

log=/home/msubra/WORK/tmo/LOG/BCH1043.9987.log 
log=${log#*/} 
echo "${log%%.*}" 
1

不需要調用基名,您可以使用內置到外殼爲整件事參數替換:

$ cat x.sh 
filepath="/home/msubra/WORK/tmo/LOG/BCH1043.9987.log" 

# Strip off the path. Everything between and including the slashes. 
filename=${filepath##/*/} 

# Then strip off everything after and including the first dot. 
part1=${filename%%.*} 

echo $part1 
$ ./x.sh 
BCH1043 
$ 

在文件路徑的點不會造成任何麻煩。

詳情參見這裏第4.5.4節:http://docstore.mik.ua/orelly/unix3/korn/ch04_05.htm

哦,抵制誘惑,變得棘手而做這一切在同一行。分解成單獨的組件更容易調試和維護,誰知道你可能也需要使用這些組件(路徑和文件名的其餘部分)。

+0

這對於非絕對路徑來說是失敗的,並且在我的回答中仍然存在一些我在鏈接到的答案中的一些注意事項。除此之外,雖然它的作品。 – 2014-11-06 17:25:56

+0

絕對路徑不是要求的一部分,但要採取的措施。 – 2014-11-06 17:33:00

+0

哎呀我的意思是相對路徑。 – 2014-11-06 17:40:03