是否可以在变量中放置管道?



我有一个很长的管道,我在脚本中不断地重用它,为了便于阅读,我想把管道放在一个变量中。这可能吗?

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

相关内容

  • 没有找到相关文章

最新更新