2014-11-06 129 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