如何解决如何从大小写中提取姓名列表?
因此,举例来说,我有一堆不断写入/var/log/app//nonsence.file的应用程序,这些文件夹没有其他文件夹,仅是这组应用程序中的日志。这样我就可以轻松做到:
cat /var/log/app/*/nonsence.file 然后我会得到很好的应用日志流。
与此流混合的是对人的定期引用。我想构建一个脚本来在流中出现某些名称时触发。
我可以很容易地做到这一点:
cat /var/log/app/*/nonsence.file | grep'greg | john | suzy | stacy' 这样我就可以将THAT放入一个简单的脚本中:
#!/bin/sh
NAME=`cat /var/log/app/*/nonsence.file | grep 'greg\|john\|suzy\|stacy'`
case "$NAME" in
"greg" ) echo "I found greg!" >> ~/names.meh ;;
"john" ) echo "I found john!" >> ~/names.meh ;;
"suzy" ) echo "I found suzy!" >> ~/names.meh ;;
"stacy" ) echo "I found stacy!" >> ~/names.meh ;;
* ) echo "forever alone..." >> ~/names.meh ;;
esac
轻松愉快!
麻烦的是,名称列表会不时更改,我真的想要一个更整洁的列表。
经过一番思考,我相信我真正想做的只是将每个名称仅添加到case部分。那么我需要在NAME变量部分做什么,以告诉命令grep用例部分引用的名称?
解决方法
cat file | grep
是cat
的无用用法。只是grep file
。
默认情况下,管道中的命令会缓冲块。
>> ~/names.meh
只是重复。只需为整个块指定一次即可。
不建议反引号`。最好改用$(..)
。
每次分配NAME=...
时,您似乎都想要读取文件:
...我想构建一个脚本来触发何时流中出现某些名称。
建议您何时在脚本中显示该名称,而不要过一段时间。
您可以尝试:
patterns=(greg john suzy stacy)
printf "%s\n" /var/log/app/*/nonsence.file |
# tail each file at the same time by spawning for each a background process
xargs -P0 -n1 tail -F -n+1 |
# grep for the patterns
# pass the patterns from a file
# the <(...) is a process substitution,a bash extension
grep --line-buffered -f <(printf "%s\n" "${patterns[@]}") -o |
# for each grepped content execute different action
while IFS= read -r line; do
case "$line" in)
"greg") someaction; ;;
# etc
*) echo "Internal error - unhandled pattern"; ;;
esac
done >> ~/names.me
因为两次重复查看模式都是 lame ,所以您可以执行关联功能以将模式映射到函数名称,或者只使用唯一的函数名称并从模式列表中生成图形:
pattern_greg() { echo "greg"; }
pattern_kamil() { echo "well,not greg"; }
patterns=($(declare -F | sed 's/declare -f //; /^pattern_/!d; s/pattern_//'))
... |
while IFS= read -r line; do
if declare -f pattern_"$line" >/dev/null 2>&1; then
pattern_"$line"
else
echo "Internal error occured"
fi
done
或者,但是我更喜欢这些功能:
greg_function() { echo do something; }
kamil_callback() { echo do something else; }
declare -A patterns
patterns=([greg]=greg_function [kamil]=kamil_callback)
... | grep -f <(printf "%s\n" ${!patterns[@]}) ... |
while IFS= read -r line; do
# I think this is how to check if array element is set
if [[ -n "${patterns[$line]}" ]]; then
"${patterns[$line]}"
else
echo error
fi
done
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。