Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何省略终端输出中的第一列,并使用unix将输出(连同省略的第一列)并行写入文件?_Shell_Unix_Awk_Sed_Tee - Fatal编程技术网

Shell 如何省略终端输出中的第一列,并使用unix将输出(连同省略的第一列)并行写入文件?

Shell 如何省略终端输出中的第一列,并使用unix将输出(连同省略的第一列)并行写入文件?,shell,unix,awk,sed,tee,Shell,Unix,Awk,Sed,Tee,我被困在下面的场景中 我在一个名为:small_script.sh的脚本中添加了这些 #!/bin/bash uname uname -r uname -a pwd 我需要终端中显示的每一行的时间戳(以秒为单位),并且需要写入文件。。因此,我实施如下: ./small_script.sh | while read R; do echo "$(date +%s) $R"; done | tee output.txt 1526635998 Darwin 1526635998 17.4.0 15

我被困在下面的场景中

我在一个名为:small_script.sh的脚本中添加了这些

#!/bin/bash

uname
uname -r
uname -a
pwd
我需要终端中显示的每一行的时间戳(以秒为单位),并且需要写入文件。。因此,我实施如下:

./small_script.sh | while read R; do echo "$(date +%s) $R"; done | tee output.txt

1526635998 Darwin
1526635998 17.4.0
1526635998 Darwin C02V41QWHV2R 17.4.0 Darwin Kernel Version 17.4.0 ..
1526635998 /Users/home/duraja
现在,我的查询是我正在终端中寻找输出,其中第一列(以秒为单位的日期)没有显示,但第一列(以秒为单位的日期)应该在我的文本文件中

样本输出期望

终端输出应显示

Darwin
17.4.0
Darwin C02V41QWHV2R 17.4.0 Darwin Kernel Version 17.4.0 ..
/Users/home/duraja
1526635998 Darwin
1526635998 17.4.0
1526635998 Darwin C02V41QWHV2R 17.4.0 Darwin Kernel Version 17.4.0 ..
1526635998 /Users/home/duraja
文本文件输出应显示

Darwin
17.4.0
Darwin C02V41QWHV2R 17.4.0 Darwin Kernel Version 17.4.0 ..
/Users/home/duraja
1526635998 Darwin
1526635998 17.4.0
1526635998 Darwin C02V41QWHV2R 17.4.0 Darwin Kernel Version 17.4.0 ..
1526635998 /Users/home/duraja

我怎样才能做到呢?请建议。

您可以在
tee
命令后使用
sed
删除时间戳:

./small_script.sh | while read R; do echo "$(date +%s) $R"; done | tee output.txt | sed 's/^[^ ]\+ //'

sed
regex匹配每一项,直到行的开头有一个空格。

由于您在帖子中没有共享完整的要求、示例输入或示例输出,请尝试以下操作(基于您提供的代码和问题),其中第一列将被打印到
输出_文件
,其余行将在终端上打印

./small_script.sh | 
awk -v date=$(date +%s) '{print $0 OFS date > "output_file";print}' 

可以在T形三通命令之后使用“剪切”命令:

./small_script.sh | while read R; do echo "$(date +%s) $R"; done | tee output.txt | cut -c12-
有关避免使用shell循环执行此操作的原因,请参见

根据问题中的循环,假设您希望在生成每个输出行时使用时间戳,而不是在生成第一行时使用时间戳(这很简单),并给出以下shell脚本:

$ cat ./small_script.sh
uname
sleep 1
uname -r
sleep 1
uname -a
sleep 1
pwd
使用shell和xargs(其中可能有一些bash-isms/gnu-isms):

对于时间函数,使用GNU awk:

$ ./small_script.sh | awk '{print systime(), $0 > "outfile2"} 1'
CYGWIN_NT-6.1
2.9.0(0.318/5/3)
CYGWIN_NT-6.1 Foo 2.9.0(0.318/5/3) 2017-09-12 10:18 x86_64 Cygwin
/home/Ed

$ cat outfile2
1526673256 CYGWIN_NT-6.1
1526673257 2.9.0(0.318/5/3)
1526673258 CYGWIN_NT-6.1 Foo 2.9.0(0.318/5/3) 2017-09-12 10:18 x86_64 Cygwin
1526673259 /home/Ed
对于任何awk:

$ ./small_script.sh | awk '{cmd="date +\"%s\""; date=( (cmd | getline line) > 0 ? line : "ERR"); close(cmd); print date, $0 > "outfile3"} 1'
CYGWIN_NT-6.1
2.9.0(0.318/5/3)
CYGWIN_NT-6.1 Foo 2.9.0(0.318/5/3) 2017-09-12 10:18 x86_64 Cygwin
/home/Ed

$ cat outfile3
1526673404 CYGWIN_NT-6.1
1526673405 2.9.0(0.318/5/3)
1526673406 CYGWIN_NT-6.1 Foo 2.9.0(0.318/5/3) 2017-09-12 10:18 x86_64 Cygwin
1526673407 /home/Ed

您可以使用
cut
从数据中分割秒数。我将
R
改为小写,使用
read
-R
选项并使用
printf
,这些都是离题的改进

./small_script.sh |while read -r r; do
   printf "%s %s\n" $(date +%s) "$r"
done | tee output.txt | cut -d" " -f2-
您已经可以在循环中拆分输出。
您可以使用stderr写入终端

./small_script.sh |while read -r r; do
   >2 printf "%s\n" "$r"
   printf "%s %s\n" $(date +%s) "$r"
done > output.txt 
缺点是输出将到达stderr,因此重定向终端输出或使用
| more
与您预期的不同。
在循环中以秒重定向行时,应首先删除输出文件(如果存在)


如果你能在帖子中告诉我们你的输入样本和预期输出样本,我们可以在这方面为你提供更多帮助。请检查我的答案一次,让我们知道这是否有帮助?另外,为了更好地理解问题,请在您的帖子中发布示例,并附上您问题的所有细节。您好@RavinderSingh13。。我已经更新了输出。请建议。谢谢,请检查我编辑的答案,然后让我知道?澄清一下-您是在寻找脚本生成第一行输出的时间还是每行输出的生成时间?如果您在发布的示例中添加了一些“sleep 1”,则会更清楚您想要的是哪一个。此外,时间戳应在脚本执行时保留,该时间戳应与文本文件中的时间戳相同。希望我能够正确地表达我的意思。@duraja到底什么地方不起作用?终端输出不显示时间戳,文件显示。这不是你想要的吗?是的@oliv你是对的。但是您提供的输出仍然在终端输出中显示时间戳。我已在说明中添加了示例输出供您参考。@duraja可能您使用的
sed
版本不接受正则表达式,请将sed命令替换为
cut-d”“-f2-
终端输出省略了第一列(日期),但在输出文本文件中,只有最后一行得到了文本文件中的时间戳。@duraja,现在检查我编辑的答案,然后告诉我?