我最后在Python中为此编写了一个快速的小脚本,但我想知道是否有一个实用程序可以提供文本,其中每个行前面都有一些文本 - 在我的特定情况下,是一个时间戳.理想情况下,使用方式如下:
cat somefile.txt | prepend-timestamp
Run Code Online (Sandbox Code Playgroud)
(在你回答sed之前,我试过这个:
cat somefile.txt | sed "s/^/`date`/"
Run Code Online (Sandbox Code Playgroud)
但是,这只会在执行sed时评估date命令,因此每行都会错误地添加相同的时间戳.)
有没有办法在没有输出缓冲的情况下运行shell命令?
例如,hexdump file | ./my_script只会将缓冲块中的hexdump输入传递给my_script,而不是逐行传递.
实际上我想知道如何使任何命令无缓冲的一般解决方案?
在bash/ksh中我们可以为STDERR重定向添加时间戳吗?
例如myscript.sh 2> error.log
我想在日志上写一个时间戳.
我正在尝试创建将根据某种模式过滤输入文件的AWK脚本,并使用strftime()函数进行一些计算.
($2 ~ /^[HB]/ && $2 ~ /n$/){
print strftime("%Y")
}
Run Code Online (Sandbox Code Playgroud)
使用的翻译是mawk.使用此命令触发此脚本时:
awk -f script3 inputFile
Run Code Online (Sandbox Code Playgroud)
我收到错误:"函数strftime从未定义"
我的目标是为我的ssh会话中使用的命令创建一个带时间戳的日志.
只要输出未被过滤,Tee就可以实时工作.当我tail -F test.log时,以下命令实时附加输出:
#!/bin/bash
ssh "$@" | tee -a test.log
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试通过此问题中建议的方法修改tee的输出时,输出不再是实时的.例如:
#!/bin/bash
ssh "$@" | tee >(grep -e '.*\@.*\:.*\$.*' --color=never >> test.log)
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果我用"yes"命令代替ssh命令,则输出会被实时过滤.
实时处理非常重要,因为我的脚本需要为每一行附加当前时间戳并尽可能多地删除输出.到目前为止,这是我的脚本:
#!/bin/bash
logfile=~/test.log
desc="sshlog ${@}"
tab="\t"
format_line() {
while IFS= read -r line; do
echo "$(date +"%Y-%m-%d %H:%M:%S %z")${tab}${desc}${tab}${line}"
done
}
echo "[START]" | format_line >> $logfile
ssh "$@" | tee >(grep -e '.*\@.*\:.*\$.*' --color=never | format_line >> $logfile)
echo "[END]" | format_line >> $logfile
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题,为什么ssh命令与tee的行为不同于yes命令?