首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在bash中解析配置文件

在bash中解析配置文件
EN

Stack Overflow用户
提问于 2013-05-23 05:51:22
回答 5查看 3.4K关注 0票数 4

这是我的配置文件(dansguardian- config ):

代码语言:javascript
复制
banned-phrase duck

banned-site allaboutbirds.org

我想写一个bash脚本,它将读取此配置文件并为我创建一些其他文件。这是我到目前为止所知道的,大部分都是伪代码:

代码语言:javascript
复制
while read line
do
    # if line starts with "banned-phrase"
        # add rest of line to file bannedphraselist
    # fi

    # if line starts with "banned-site"
        # add rest of line to file bannedsitelist
    # fi
done < dansguardian-config

我不确定是否需要使用grep、sed、awk等。

希望这是有意义的。我真的很讨厌DansGuardian列表。

EN

回答 5

Stack Overflow用户

发布于 2013-05-23 05:57:15

你可以这样做

代码语言:javascript
复制
sed -n 's/^banned-phrase *//p' dansguardian-config > bannedphraselist
sed -n 's/^banned-site *//p' dansguardian-config > bannedsitelist

尽管这意味着要读取该文件两次。不过,我怀疑可能的性能损失是否重要。

票数 4
EN

Stack Overflow用户

发布于 2013-05-23 05:57:20

您可以一次读取多个变量;默认情况下,它们以空格分隔。

代码语言:javascript
复制
while read command target; do
  case "$command" in
    banned-phrase) echo "$target" >>bannedphraselist;;
    banned-site) echo "$target" >>bannedsitelist;;
    "") ;; # blank line
    *) echo >&2 "$0: unrecognized config directive '$command'";;
  esac
done < dansguardian-config

只是作为一个例子。更聪明的实现应该是先读取列表文件,确保没有被禁止,等等。

票数 4
EN

Stack Overflow用户

发布于 2013-05-23 07:21:48

使用echo text >> file的所有解决方案有什么问题?可以用strace检查,在每个这样的步骤中,打开file,然后定位到最后,然后写入text并关闭文件。所以如果有1000次echo text >> file,那么就会有1000次openlseekwriteclose。可以通过以下方式大幅减少openlseekclose的数量:

代码语言:javascript
复制
while read key val; do
  case $key in
  banned-phrase) echo $val>&2;;
  banned-site) echo $val;;
  esac
done >bannedsitelist 2>bannedphraselist <dansguardian-config

stdout和stderr被重定向到文件,并在循环活动时保持打开状态。因此,文件只打开一次,然后关闭一次。不需要我的帮助。此外,这种方式更多地使用了文件缓存,因为对close的不必要调用不会每次都刷新缓冲区。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16702190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档