【问题标题】:Command in function not works as manualy typed in terminal函数中的命令不能像终端中手动输入的那样工作
【发布时间】:2017-03-17 16:28:22
【问题描述】:

我需要为这样的东西解析文档:

#00 service.
log: servicelogin
pass: password

别担心,文件已加密并与系统分离 :) 所以你看到第一行和第二行都有“服务”,所以这样做:

cat /path | grep -A 3 service

两次找到服务时返回 4 行。

但是,在终端输入这个命令:

cat /path | grep -A 3 service | grep -A 3 -m 1 "/."

像魅力一样工作。

但是!因为我需要在最后输入“服务”,所以别名不够好。所以我创建了一个函数:

function do-stuff {
    cat /path | grep -A 3 $1 | grep -A 3 -m 1 "/."
}

它就像第一个一样工作,无需再次解析。

就是这样。谢谢!

=== 编辑 ===

当然,我尝试过像这样组合它

cat /path | grep -A 3 -m 1 service

但这也行不通。只返回一行。

=== 编辑 ===

我只需要获取 3 行,而不是 4 行,因为它会在下一行再次找到它。

【问题讨论】:

  • 了解你想要的结果会很有帮助。

标签: linux bash parsing text grep


【解决方案1】:

您的正则表达式不够具体。也许像

grep -A 3 '#.* service\.' /path

【讨论】:

  • 不,它不起作用。在这两种方式中:a)需要搜索参数是最后一个或在函数中。 b) 它无论如何都会返回第一个结果(4 行)。
  • 为什么要放在最后?如果您正在定义一个函数,您可以控制参数的去向(这只是为什么您使用函数而不是别名的原因之一)。 do_stuff () { grep -A 3 "$1" /path; }.
  • 正如我在帖子中所写:func 无法以某种方式工作。像这样的函数 [ function do-passlook-mine () { cat $outsidedir/documents/accounts/mine.txt | grep -A 3 "$1" | grep -A 3 -m 1 "\."; } ] 不带括号。但!!!这个函数有效: [ function do-passlook-mine () { grep -A 3 "$1" $outsideir/documents/accounts/mine.txt | grep -A 3 -m 1 "\."; } ] 也许它不喜欢管道吧。谢谢你:)
  • 如果您只需要 3 行中的第一行,为什么还需要 -A 3 或两次调用 grepgrep 'service\.' /path.
猜你喜欢
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多