我有一个很长的管道,我在脚本中不断地重用它,为了便于阅读,我想把管道放在一个变量中。这可能吗?
cat miami.tmp | grep -A5 "$date" | grep -A3 "$nexthour" | grep "celsius" | grep -E -o '[-]?[0-9].[0-9]' | head -n 1 >> miami.txt
我试过了
temperature=$( | grep -A5 "$date" | grep -A3 "$nexthour" | grep "celsius" | grep -E -
o '[-]?[0-9].[0-9]' | head -n 1 )
或
temperature="| grep -A5 "$date" | grep -A3 "$nexthour" | grep "celsius" | grep -E -o '[-]?[0-9].[0-9]' | head -n 1"
但是得到错误,说没有找到命令。
这是一个使用bash shell函数的好例子。您可以这样定义一个函数:
function temperature() { grep foo | grep bar | grep baz; }
只是确保最后一个命令以分号结束。使用
调用函数cat file.tmp | temperature
函数也可以有参数,可以用通常的$1
,$2
等符号访问,这些参数可以传递给函数(空格分隔)。
$ function hello() { echo "Hello $1!"; }
$ hello world
Hello world!
你应该把它放在一个函数中。
temperature () {
grep -A5 "$date" |
grep -A3 "$nexthour" |
grep "celsius" |
grep -E -o '[-]?[0-9].[0-9]' |
head -n 1
}
也许你想把日期和小时作为参数。
temperature () {
grep -A5 "$1" |
grep -A3 "$2" |
grep "celsius" |
grep -E -o '[-]?[0-9].[0-9]' |
head -n 1
}
单独来看,这看起来像是迫切希望被重构为Awk。
temperature () {
awk -v date="$1" nexthour="$2" '
$0 ~ date { p=5 }
p && p-- && ($0 ~ nexthour) { p=3 }
p && p-- && /celsius/ { n = split($0, a, /[^-.0-9]/, a);
for(i=1; i<=n; ++i) if (a[i] ~ /^-?[0-9].[0-9]$/)
{ print(a[i]); exit }'
}
(未经测试,因为您没有提供测试数据。我不得不猜测一些事情。如果您通过系统地循环日期和时间来调用它,那么也可以将其重构到Awk脚本中。
用法:
temperature 2022-11-24 04 <miami.tmp >>miami.txt
可能参见https://mywiki.wooledge.org/BashFAQ/050