编写第一个支持管道的脚本

问题域

我需要计算两个形如“yyyy年mm月dd日 hh:mm:ss”时间值的差,如果是一两个可能就手动计算了,但是有好几十个呢,python 又不会,c 写起来都要崩溃,还是 bash 解决吧。

解决方案一

将时间值放在文件中,然后让脚本读取文件不就好了?不过我想起来还没有写过支持管道的脚本呢,这次就写吧。

要支持管道,也就是说 stdin 来源于上一个命令的 stdout。使用循环读取行内容的方法可以解决这个问题。

1
2
3
4
5
6
7
8
9
# 每一行: 2019-09-18 12:26:03, 2019-09-18 13:36:54
while read line; do
start_time=${line%,*}
end_time=${line#*,}
start_time=$(date -d "$start_time" +'%s')
end_time=$(date -d "$end_time" +'%s')
diff_sec=$(($end_time - $start_time))
echo $line, $diff_sec
done <&0;

这是最简单的处理管道中的行数据的方法了吧。

此时只能如下使用:

1
cat time.txt | sed 's/\(年\|月\)/-/g' | sed 's/日//g' | timediff

如果我还想从第一个参数中读取文件中的行数据怎么办呢?

从管道数据来源上思考,我们可以重定向 stdin 到文件,然后继续用 read 读取行。

1
2
3
4
5
6
7
8
9
10
11
12
13
if [ $# -gt 0  ];then	# $# 参数个数
exec 0<$1; # $1 第一个参数
fi

while read line; do
start_time=${line%,*}
end_time=${line#*,}
start_time=$(date -d "$start_time" +'%s')
end_time=$(date -d "$end_time" +'%s')
diff_sec=$(($end_time - $start_time))
echo $line, $diff_sec
done <&0;
exec 0<&-

此时也可以这么使用:

1
2
# 2019-09-18 12:26:03, 2019-09-18 13:36:54
timediff ./time.txt

解决方案二

去使用 excel 中的 TEXT 函数TEXT(F1-E1, ‘[s]’)就可以计算F1-E1的时间差了。时间格式不能包含”年月日“。

本文结束感谢您的阅读
感谢打赏,继续前行!