【问题标题】:I am trying to use a shell script that will contain "awk" to run against a file我正在尝试使用包含“awk”的shell脚本来针对文件运行
【发布时间】:2021-04-05 16:59:53
【问题描述】:
read -p "Enter the name for the dealer you are searching for: " dealer
read -p "Enter the time of day you are checking for this dealer: " time
echo "$time $dealer" | awk '/$1/'

这就是我目前所拥有的。根据我目前了解到的情况,这会将用户输入的值存储在 dealertime 中。

接下来我要做的是echo,该输入针对一系列命令来查看文件是否包含这些输入。

例如,轮盘赌庄家“Billy”每隔一天在“05 AM”工作。要查看给定日期的数据是否包含他的工作日志,我会运行这个脚本。

./script

运行文件:

输入您要搜索的经销商的名称:Billy

输入您正在查看该经销商的时间:05

现在这是我正在寻找解决方案的地方。调用脚本时是否对文件运行脚本?我是否让用户输入文件作为第三个参数,然后将其作为脚本内部的值?

如果我学习正确,那么经销商将被存储为 arg1 并由 $1 访问,时间为 $2。

那么我会跑吗:awk '1$.2$' file

意思是它们之间可以有任何东西,但如果一行确实包含名称和时间,那么这就是我要搜索的内容。

05:00:00 AM 凯蒂·宾比利·琼斯 Evalyn Howell

这是我的脚本所需的输出,我知道时间排在第一位,所以我会相应地进行调整,但我正在尝试更进一步。

【问题讨论】:

  • 交互式提示通常是个坏主意。使脚本接受参数作为命令行参数。这使得围绕这个构建新脚本变得更加容易,并且用户可以使用 shell 的历史记录、完成、变量和其他工具在一系列输入等上重复运行脚本。

标签: regex linux shell ubuntu


【解决方案1】:

从标准输入中读取经销商的输入和时间后,您可以使用以下正则表达式运行awk

"^$time.*$dealer"

匹配文件中的行。 (您可能需要对其进行调整以适应您的需求,但作为起点应该就足够了)。

至于文件本身,awk 可以从标准输入读取,因此您可以将文件重定向到脚本,如下所示:

./script < data.txt

然后像这样运行awk

awk -v re="^$time.*$dealer" '$0 ~ re { print $0 }'

这样awk 将从标准输入读取文件内容。

或者,您可以提供文件名作为参数,如下所示:

./script data.txt

然后像这样运行awk

awk -v re="^$time.*$dealer" '$0 ~ re { print $0 }' "$1"

$1 是文件名。

您也可以使用对grep 的等效调用(在这种情况下更简洁!):

grep "^$time.*$dealer" "$1"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    相关资源
    最近更新 更多