我如何开始使用get-opts? 输出应该与此类似,但我需要从标准输入
获取输入的过滤器 awk < /var/log/messages '{ print $2, $1, $5}' | uniq -c | awk '{ print $2, $3, $1, $4 }' | cut -d':' -f1
答案 0 :(得分:0)
如果你编写一个shell脚本,那么正常的答案是使用"$@"
,这有点神奇:
#!/bin/bash
awk '{ print $2, $1, $5}' "$@" |
uniq -c |
awk '{ print $2, $3, $1, $4 }' |
cut -d':' -f1
"$@"
表示&#39;所有命令行参数&#39;,如果没有命令行参数,则不表示任何内容。鉴于awk
是一个读取命令行上命名的文件的命令,或者如果没有指定文件则是标准输入,这将正常工作 - 它是设计好的通用Unix工具的重要部分。如果要在没有命令行参数的情况下处理/var/log/messages
,则需要使用shell parameter expansion表示法:
"${@:-/var/log/messages}"
如果参数列表中没有参数,则它将/var/log/messages
替换为文件名。
您可以在Special Parameters下的Bash手册中找到有关"$@"
的更多信息。另请参阅How to iterate over the arguments in a Bash script。
请注意,uniq
不会对数据进行排序;它寻找相邻且相同的线。您通常会在sort
之前插入uniq -c
:
#!/bin/bash
awk '{ print $2, $1, $5}' "$@" |
sort |
uniq -c |
awk '{ print $2, $3, $1, $4 }' |
cut -d':' -f1