2013-05-22 44 views
3

我不是那么容易的任务,我需要有用的建议。bash从文件中的每个字符串中读取一个字符

我有一个文件,其中包含主机列表:

host1.example.domain.com 
host2.example.domain.com 
host3.example.domain.com 

,并在bash脚本变量,包含所有可能的主机:

hostblabla.newdomain.org 
... 
host3.example.domain.com 

我需要的是进行简单的正则表达式是仅与我的第一个列表中存在的主机相匹配。 我想这样说:

  1. 阅读所有字符串的第一个字符在我的第一清单
  2. 检查是否所有charaters是相同的
  3. 如果是这样,这个字符添加到正则表达式
  4. 否则让regxep = $regexp"*"
  5. 检查正则表达式与我的变量,它包含所有主机

但我已经点燃在Bash中,我不知道如何从bash中的每个字符串中只读取一个字符?

我知道我可以做到以下几点:

first_character=${a: :1} 

但这是从全局变量$仅第一系统字符。

+0

你为什么把它作为脚本变量,而不是作为一个外部文件? –

+0

它没关系,如果它很重要,我可以写出来,但我猜不。 – xolodec

回答

3

所以你需要两个列表的交集,是吗?

把具有独特的线整理两份名单到文件:

sort -u original_list_of_hosts.txt > sorted_list_of_hosts.txt 
echo "$POSSIBLE_HOSTS" | sort -u > possible_hosts.txt 

,然后使用join命令把两个文件的公共部分:

join sorted_list_of_hosts.txt possible_hosts.txt 

它将输出排序它存在的主机列表在这两个列表中。

+1

这可以表示为一个使用流程替换的单线程''join <(sort -u hostfile.txt)<(echo“$ POSSIBLE_HOST”| sort -u)' –

+0

@ShawnChin:是的,我知道。我想让它容易理解。在现实世界中,我会按照你的建议使用它,以避免临时文件。 +1 –

+0

不,不幸的是没有。因为我拥有全部 host1.example.domain.com host2.example.domain.com host3.example.domain.com 在我的第二个列表中。所以这两个列表的交集将与第一个相同。 确实使用连接的想法非常好。但不幸的是,我的情况并非如此。 – xolodec

0

使用grep:

#!/bin/bash 
s[0]="hostblabla.newdomain.org" 
s[1]="host3.example.domain.com" 
regex="" 
for h in ${s[@]}; do 
    regex="$regex -e $h " 
done 
grep $regex input 
+0

我在想那样,但我怎么能将包含所需主机列表的文件转换为数组's'? 我在文件中;做 ??? – xolodec

相关问题