如果不是这样,我可以在 grep 中处理多个 AND 参数吗?



我正在尝试在shell中grep多个参数。 我下了像 ./script arg1 arg2.这样的订单。氩氮 我希望他们采取行动 egrep -i "arg1" mydata |EGREP -i "Arg2" |...egrep -i "argN" |awk -f display.awk 为了匹配 AND 格式的模式。 我的流程出了什么问题?

像这样的代码是否正确 egrep -i "arg1" mydata |EGREP -i "Arg2" |...egrep -i "argN" |awk -f display.awk 以 AND 格式获取多个模式??

if [ $# -eq 0 ]
then
echo "Usage:phone searchfor [...searchfor]"
echo "(You didn't tell me what you want to search for.)"
exit 0
else
for arg in $*
do
if [ $arg -eq $1 ]
then
egrep -i "arg" mydata |
else
egrep -i "arg" |
fi
done
awk -f display.awk     
fi

如果我的数据有 "快乐的阳光兔子", "昏昏欲睡的兔子", 和"快乐的阳光">

如果我尝试过,我希望他们表演./脚本快乐的阳光兔子 然后只有 "快乐的阳光兔子" 出来了。

如果我尝试 ./脚本兔子那么 "快乐的阳光兔子" "昏昏欲睡的兔子" 都出来了。

直接解决方法是将管道字符移动到done之后。

此外,您应该遍历"$@"以保留参数的引用,并通常引用变量。

if [ $# -eq 0 ]
then
# print diagnostics to stderr
echo "Usage: phone searchfor [...searchfor]" >&2
echo "(You didn't tell me what you want to search for.)" >&2
exit 0
fi
for arg in "$@"
do
# Add missing dash before eq
if [ "$arg " -eq "$1" ]
then
# Surely you want "$arg" here, not the static string "arg"?
grep -E -i "$arg" mydata
else
grep -E -i "$arg"
fi
done |
awk -f display.awk     

整体逻辑似乎仍然存在缺陷;如果有两个以上的参数,您将对第一个参数的标准输入进行清理。也许您想添加一个选项以允许用户指定输入文件名,并-指定标准输入?然后所有常规参数都将是搜索字符串,就像使用消息所建议的那样。

如果确实是循环所有参数以生成逻辑 AND,请尝试以下操作:

also () {
local what
what=$1
shift
if [ $# -gt 0 ]; then
grep -E -i "$what" | also "$@"
else
grep -E -i "$what"
fi
}
also "$@" <mydata | awk -f display.awk

。尽管更好的实现可能是从参数构建一个简单的 Awk 或sed脚本:

script='1'
for arg in "$@"; do
script="$script && tolower($0) ~ tolower("$arg")"
done
awk "$script" | awk -f display.awk

不过,如果搜索短语可以包含正则表达式特殊内容,这将分解(当然,对于grep -E版本也是如此;但是您可以轻松地切换到grep -F)。

将两个 Awk 脚本合并为一个可能也不难,尽管没有看到display.awk,这是推测性的。

你可以递归地解决它:

#! /bin/bash
if (( $# == 0)); then
exec cat
else
arg=$1; shift
egrep "$arg" | "$0" "$@"
fi

如果调用脚本时没有参数,则递归结束。在这种情况下,它的行为类似于cat.在您的示例中,您可以将awk放在那里。如果脚本被调用一个或多个参数,它会用第一个参数($1)调用egrep,并将剩余的参数(移位后$@)传递给自身($0)。

例:

$ ./recursive-egrep sys  < /etc/passwd
sys:x:3:3:sys:/dev:/usr/sbin/nologin
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
$ ./recursive-egrep sys no  < /etc/passwd
sys:x:3:3:sys:/dev:/usr/sbin/nologin

使用执行此操作的 https://gitlab.com/ole.tange/tangetools/tree/master/G 中的G(awk部分除外)。

概要

G [[grep 选项] 字符串] [[grep 选项] 字符串] ...

描述

G 是书写的简写(搜索与表达式匹配的单行):

grep --option string | grep --option2 string2

或使用 -g(搜索与表达式匹配的完整文件):

find . -type f | xargs grep -l string1 | xargs grep -l string1

最新更新