Bash 使用getopts grep文件并将其导出到文件:为什么会提到另一个参数?
我使用getopts获取MAC地址,并通过日志文件grep该MAC地址。看起来是这样的:Bash 使用getopts grep文件并将其导出到文件:为什么会提到另一个参数?,bash,unix,getopts,Bash,Unix,Getopts,我使用getopts获取MAC地址,并通过日志文件grep该MAC地址。看起来是这样的: #!/bin/bash while getopts ":m:hx:" opt; do case $opt in m) cat /var/log/vmlog/Verimatrix.log | grep $OPTARG | grep VCAS080455 cat /var/log/vmlog/Verimatrix.log | grep $OPTARG | grep
#!/bin/bash
while getopts ":m:hx:" opt; do
case $opt in
m)
cat /var/log/vmlog/Verimatrix.log | grep $OPTARG | grep VCAS080455
cat /var/log/vmlog/Verimatrix.log | grep $OPTARG | grep VCAS080285
cat /var/log/vmlog/Verimatrix.log | grep $OPTARG | grep VCAS080290
;;
h)
echo "./search_mac.sh -m <mac address> will filter the logs by mac address"
echo "./search_mac.sh -h will print this message"
;;
\?)
echo "Invalid option: -$OPTARG" >&2
;;
esac
done
我现在不明白如何从-x得到参数,使之成为我的案例的m)部分
一点帮助就好了
谢谢我认为最好的方法是将选项参数的值保存在shell变量中,然后在最后运行命令:
#!/bin/bash
m_arg=
x_arg=
while getopts ":m:hx:" opt; do
case $opt in
m) m_arg="$OPTARG" ;;
x) x_arg="$OPTARG" ;;
h)
echo "./search_mac.sh -m <mac address> will filter the logs by mac address"
echo "./search_mac.sh -h will print this message"
exit 0
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
esac
done
if [[ "$x_arg" ]] ; then
exec > "$x_arg" # redirect STDOUT to argument of -x
fi
< /var/log/vmlog/Verimatrix.log grep -- "$m_arg" | grep VCAS080455
< /var/log/vmlog/Verimatrix.log grep -- "$m_arg" | grep VCAS080285
< /var/log/vmlog/Verimatrix.log grep -- "$m_arg" | grep VCAS080290
#/bin/bash
m_arg=
x_arg=
而getopts:m:hx:opt;做
案例$opt-in
m) m_arg=“$OPTARG”;;
x) x_arg=“$OPTARG”;;
h)
echo.“/search_mac.sh-m将按mac地址过滤日志”
echo.“/search_mac.sh-h将打印此消息”
出口0
;;
\?)
echo“无效选项:-$OPTARG”>&2
出口1
;;
以撒
完成
如果[“$x_arg”];然后
exec>“$x_arg”#将标准输出重定向到-x的参数
fi
也就是说。这个选项对我来说似乎没有什么用处,因为
-x/home/nico/extract.txt
的含义与/home/nico/extract.txt
的含义相同。我遗漏了什么吗?我认为最好的方法是将选项参数的值保存在shell变量中,然后在最后运行命令:
#!/bin/bash
m_arg=
x_arg=
while getopts ":m:hx:" opt; do
case $opt in
m) m_arg="$OPTARG" ;;
x) x_arg="$OPTARG" ;;
h)
echo "./search_mac.sh -m <mac address> will filter the logs by mac address"
echo "./search_mac.sh -h will print this message"
exit 0
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
esac
done
if [[ "$x_arg" ]] ; then
exec > "$x_arg" # redirect STDOUT to argument of -x
fi
< /var/log/vmlog/Verimatrix.log grep -- "$m_arg" | grep VCAS080455
< /var/log/vmlog/Verimatrix.log grep -- "$m_arg" | grep VCAS080285
< /var/log/vmlog/Verimatrix.log grep -- "$m_arg" | grep VCAS080290
#/bin/bash
m_arg=
x_arg=
而getopts:m:hx:opt;做
案例$opt-in
m) m_arg=“$OPTARG”;;
x) x_arg=“$OPTARG”;;
h)
echo.“/search_mac.sh-m将按mac地址过滤日志”
echo.“/search_mac.sh-h将打印此消息”
出口0
;;
\?)
echo“无效选项:-$OPTARG”>&2
出口1
;;
以撒
完成
如果[“$x_arg”];然后
exec>“$x_arg”#将标准输出重定向到-x的参数
fi
也就是说。这个选项对我来说似乎没有什么用处,因为
-x/home/nico/extract.txt
的含义与/home/nico/extract.txt
的含义相同。我遗漏了什么吗?嗨,谢谢你的快速回答。我在聚会上还是个笨蛋。我不太清楚重定向在您的示例中是如何工作的。是打字错误还是重定向前应该有$x_arg,比如:$x_argexec
符号意味着从脚本中的该点开始,I/O重定向将发生更改。在这种情况下,写入标准输出的任何内容现在都会将其输出转到$x_arg
(/home/nico/extract.txt
)中的任何内容。再次感谢:)您最终是正确的,我想要的只是>,但该文件是可变的,这就是为什么它是一个参数。我只是不知道有什么更好的方法。。。注意,您可以这样做:file=/home/nico/extract.txt/search_mac.sh-m 00067B6D87F0>$file
。也就是说,重定向中的文件名可以由变量指定。您好,谢谢您的快速回答。我在聚会上还是个笨蛋。我不太清楚重定向在您的示例中是如何工作的。是打字错误还是重定向前应该有$x_arg,比如:$x_argexec
符号意味着从脚本中的该点开始,I/O重定向将发生更改。在这种情况下,写入标准输出的任何内容现在都会将其输出转到$x_arg
(/home/nico/extract.txt
)中的任何内容。再次感谢:)您最终是正确的,我想要的只是>,但该文件是可变的,这就是为什么它是一个参数。我只是不知道有什么更好的方法。。。注意,您可以这样做:file=/home/nico/extract.txt/search_mac.sh-m 00067B6D87F0>$file
。也就是说,重定向中的文件名可以由变量指定。您将获得UUOC(无用使用Cat)奖。三次!为什么不:grep“$OPTARG”/var/log/vmlog/Verimatrix.log | grep-E'VCAS080455 | vcas08085 | VCAS080285 | VCAS080290'
因此只需扫描日志文件一次。你可以将第二个grep减少到grep-E'VCAS080(455 | 285 | 290)
,而不会使脑细胞过度紧张。你将获得UUOC(无用使用Cat)奖。三次!为什么不:grep“$OPTARG”/var/log/vmlog/Verimatrix.log | grep-E'VCAS080455 | vcas08085 | VCAS080285 | VCAS080290'
因此只需扫描日志文件一次。您可以将第二个grep减少到grep-E'VCAS080(455 | 285 | 290)
,而不必过度拉紧脑细胞。