-
怎么输出本地存储内容_命令的输出不会保存?居然连 tee 命令都不会用!
2020-12-03 14:55:25(给Linux爱好者加星标,提升Linux技能)转自:良许很多情况下,我们需要...这时候,tee 命令就派上用场啦~tee 语法格式:$ tee [OPTIONS] [FILE]这个命令有 4 个主要选项,配合这些选项可以将结果存储在一个或者多...(给Linux爱好者加星标,提升Linux技能)
转自:良许
很多情况下,我们需要保存程序/命令的输出到本地,常用的一种方法是重定向,这也是一种很好的方法。但有个问题,如果你想要做后续操作,比如要统计输出的行数等,重定向就有困难了。
这时候,tee 命令就派上用场啦~
tee 语法格式:
$ tee [OPTIONS] [FILE]
这个命令有 4 个主要选项,配合这些选项可以将结果存储在一个或者多个文件中。4 个选项介绍如下:
Options:
Name Description -a or –append 用于在现有文件的末尾追加写入数据 -i or –ignore-interrupts 用于忽略中断信号 –help 用于显示此命令的所有可用选项 –version 用于显示命令的当前版本 Files:
即目标文件,可以是一个或者多个文件,用于存储 tee 命令的输出。
1. tee 命令基础用法
在 Linux 中,我们可以使用 ls -la 用来查看当前目录里文件的详细信息,想必大家都用过。现在,我们想要保存 ls -la 命令的输出到文件 output.txt 中,我们可以这样操作:
$ ls -la | tee output.txt
$ cat output.txtOutput:
在这里,第一个命令将 ls -la 的输出显示到终端,并将输出写入到文件 output.txt 。第二个命令显示了 output.txt 文件的具体内容,如下图所示:
2. 将输出追加到现有文件中
如果我们使用带有 -a 选项的 tee 命令的话,那么它会将命令的输出追加写入到现有文件,不会覆盖该文件原有的内容。
例如,我们想将 pwd 命令的输出追加到已有文件 output.txt 的末尾,可以这样运行以下命令:
$ pwd | tee -a output.txt
$ cat output.txt在这里,第一个命令将 pwd 的输出显示到终端,并在 output.txt 文件的末尾追加 pwd 的输出。第二个命令则用于查看输出文件的内容。如下图所示, output.txt 文件包含前一个示例和当前示例的输出
3. 输出写入多个文件
tee 命令也可以将各种命令的输出存储到多个文件中。这种情况下,我们需要使用空格隔开这些文件名。比如,我们想将 date 命令的输出存储到两个文件 output1.txt 和 output2.txt 中,我们可以这样执行命令:
$ date | tee output1.txt output2.txt
$ cat output1.txt output2.txtOutput:
在这里,第一个命令显示当前系统日期,并将值存储到两个文件 output1.txt 和 output2.txt 中。第二个命令显示这两个文件的内容,具体结果如下:
4. 忽略中断信号
大家知道,命令/程序在收到中断信号时,将被信号所中断。如果 tee 命令在执行过程中不想被中断,我们可以使用带 -i 选项来忽略命令执行时的中断信号。这种情况下,即使我们按下 CTRL + C ,命令仍会正确执行。例如:
$ wc -l output.txt | tee -i output3.txt
$ cat output.txt
$ cat output3.txtOutput:
在这里,第一个命令是计算 output.txt 文件的总行数,并将输出存储到文件 output3.txt 中。第二个命令显示了 output.txt 文件的具体内容,而第三个命令显示 output3.txt 的内容,它与 wc -l output.txt 的输出相同。
5. 将 tee 命令输出通过管道传递给另一个命令
我们可以使用管道将 tee 命令的输出传递给另一个命令。在本例子中,ls 命令将输出传递给 tee 命令,tee 命令的输出传递给 wc 命令,如下所示:
$ ls | tee output4.txt | wc -lcw
$ ls
$ cat output4.txtOutput:
在这里,第一个命令用于将 ls 命令的输出写入文件 output4.txt ,并计算 output4.txt 的行数、字数和字符数。第二个命令用于显示 ls 命令的输出,第三个命令用于查看 output4.txt 文件的内容。
6. 使用 bash 脚本执行 tee 命令
除了 Linux 命令,tee 命令也可将 bash 脚本输出写入到文件中。比如,我们使用以下代码创建名为 add.sh 的 bash 脚本,该脚本将从命令行参数中获取两个输入数字,并打印这两个数字的和。
add.sh
#!/bin/bash
a = $1
b = $2
((result= $a + $b))
echo "The addition of $a+$b=$result"如果我们想使用 tee 命令将 add.sh 脚本的输出写入到文件 result.txt 中,我们可以这样操作:
$ bash add.sh 50 90 | tee result.txt
$ cat result.txtOutput:
在这个例子里,数字 50 和 90 作为命令行参数传递给脚本 add.sh,然后它的输出通过 tee 命令写入到文件 result.txt 中。之后我们再用 cat 命令来查看 result.txt 文件的内容:
7. 隐藏 tee 输出
如果我们想要将目标命令的输出直接写入文件而不在终端中显示,那我们可以将 tee 命令结果重定向到 /dev/null 中,比如:
$ df | tee output5.txt > /dev/null
$ cat output5.txtOutput:
在这里,第一个命令用于将 df 命令的输出写入文件 output5.txt 中,同时命令的结果不回显在终端中。第二个命令用于查看 output5.txt 文件内容 。
大家都学会了吗?
推荐阅读
(点击标题可跳转阅读)
cat 命令的源码进化史
玩转Bash变量
每天一个linux命令(10):cat 命令
看完本文有收获?请分享给更多人
关注「Linux 爱好者」加星标,提升Linux技能
好文章,我在看❤️
-
用pickle模块储存对象的实例
2017-06-11 10:12:13但是,这些都是储存简单的数据类型,那么当我们需要存储一个类的实例的时候该怎么存储呢? 实际上,我们需要用到一个模块———pickle,翻译为泡菜坛子 首先贴上一个blog:pickle的使用方法 然后贴上一份代码...众所周知,当我们需要储存数据的时候,就需要用到重定向。但是,这些都是储存简单的数据类型,那么当我们需要存储一个类的实例的时候该怎么存储呢?
实际上,我们需要用到一个模块———pickle,翻译为泡菜坛子
首先贴上一个blog:pickle的使用方法
然后贴上一份代码:
import pickle class Person(): def __init__(self, name, age): self.name = name self.age = age def show(self): print(self.name + '_' + str(self.age)) if __name__ == "__main__": a = Person('tian', 20) a.show() c = Person('babydragon' ,5) f = open('test.txt', 'wb')#这里一定要加上b,因为文件默认的write不能是bytes类型的,可以自己尝试着删去看报错 pickle.dump(a, f, 0) pickle.dump(c, f, 0) f.close() f = open('test.txt', 'rb') b = pickle.load(f) mm = pickle.load(f) cc = pickle.load(f)#有点类似于迭代器的感觉,这个就很强了,因为可以储存具体的实例666 f.close() b.show() mm.show() print(b.name)
-
MapReduce读/写RCFile文件
2016-04-03 19:39:24所以,RCFile是不可以用head或tail命令截取某些行重定向新文件中。由于RCFile广泛应用于Hive等系统中,所以我们就先看看用MapReduce怎么读取RCFile文件。 RCFile文件转换成CSV文件 public class RCFileToCSV {RCFile是Facebook制定的一种高效存储结构,它结合了行存储和列存储的优点,应用于Hive,Pig等系统中。所以,RCFile是不可以用head或tail命令截取某些行重定向新文件中。由于RCFile广泛应用于Hive等系统中,所以我们就先看看用MapReduce怎么读取RCFile文件。
RCFile文件转换成CSV文件
public class RCFileToCSV { public static class MapKlass extends Mapper<Object, BytesRefArrayWritable, NullWritable, Text>{ @Override protected void map(Object key, BytesRefArrayWritable values, Context context) throws IOException, InterruptedException { Text txt = new Text(); StringBuilder sb = new StringBuilder(); for(int i = 0; i < values.size(); i++){ BytesRefWritable value = values.get(i); txt.set(value.getData(), value.getStart(), value.getLength()); if(i == values.size() - 1){ sb.append(txt.toString()); } else { sb.append(txt.toString() + "\t"); } } context.write(NullWritable.get(), new Text(sb.toString())); } } public static void main(String[] args)throws Exception{ Configuration conf = new Configuration(); String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); for(String arg : otherArgs){ System.out.println(arg); } if(otherArgs.length != 2){ System.err.println("Usage: jar <input> <output>"); System.exit(1); } Job job = new Job(conf, "RCFile to TXT"); job.setJarByClass(RCFileToCSV.class); job.setMapperClass(MapKlass.class); job.setOutputKeyClass(NullWritable.class); job.setOutputValueClass(Text.class); //Reduce's number is 0. job.setNumReduceTasks(0); job.setInputFormatClass(RCFileMapReduceInputFormat.class); job.setOutputFormatClass(TextOutputFormat.class); RCFileMapReduceInputFormat.addInputPath(job, new Path(otherArgs[0])); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } }
CSV文件转换问RCFile文件
public class CSVToRCFile { public static class ToRCFileMapper extends Mapper<Object, Text, NullWritable, BytesRefArrayWritable>{ private byte[] fieldData; private int numCols; private BytesRefArrayWritable bytes; @Override protected void setup(Context context) throws IOException, InterruptedException { // TODO Auto-generated method stub numCols = context.getConfiguration().getInt("hive.io.rcfile.column.number.conf", 0); bytes = new BytesRefArrayWritable(numCols); } @Override protected void map(Object key, Text values, Context context) throws IOException, InterruptedException { // TODO Auto-generated method stub bytes.clear(); String[] cols = values.toString().split(","); for(int i = 0; i < numCols; i++){ fieldData = cols[i].getBytes("UTF-8"); BytesRefWritable cu = new BytesRefWritable(fieldData, 0, fieldData.length); bytes.set(i, cu); } context.write(NullWritable.get(), bytes); } } public static void main(String[] args)throws Exception { // TODO Auto-generated method stub int rowGroupSize = 16 * 1024 * 1024; int ioBufferSize = 128 * 1024; int numCols = 0; Configuration conf = new Configuration(); String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); if(otherArgs.length != 4){ System.err.println("Usage: <txt> <rcfile> <table name> <column number>"); System.exit(1); } conf.setInt("hive.io.rcfile.record.buffer.size", rowGroupSize); conf.setInt("io.file.buffer.size", ioBufferSize); numCols = Integer.parseInt(otherArgs[3]); Job job = new Job(conf, "TXT to RCFile"); job.setJarByClass(CSVToRCFile.class); job.setMapperClass(ToRCFileMapper.class); job.setMapOutputKeyClass(NullWritable.class); job.setMapOutputValueClass(BytesRefArrayWritable.class); //Reduce's number is 0. job.setNumReduceTasks(0); FileInputFormat.addInputPath(job, new Path(otherArgs[0])); job.setOutputFormatClass(RCFileMapReduceOutputFormat.class); RCFileMapReduceOutputFormat.setColumnNumber(job.getConfiguration(), numCols); RCFileMapReduceOutputFormat.setOutputPath(job, new Path(otherArgs[1])); RCFileMapReduceOutputFormat.setCompressOutput(job, false); System.exit(job.waitForCompletion(true) ? 0 : 1); } }
注意:Hadoop和Hive的版本匹配。参考文献:
http://www.thebigdata.cn/Hadoop/14976.html
http://www.tuicool.com/articles/YNfQn2
-
易学C++,C++入门
2009-12-06 14:30:115.3.2 怎么让输出的东西更好看 5.4 While循环 5.4.1 当型循环 5.4.2 导火索——do 5.5 方法指导 5.6 习题 第6章 好用的“工具”——函数 6.1 简单的“工具”——函数 ... -
C语言编程要点
2017-09-18 00:10:3710.1. 用什么方法存储标志(flag)效率最高? 147 10.2. 什么是“位屏蔽(bit masking)”? 148 10.3. 位域(bit fields)是可移植的吗? 150 10.4. 移位和乘以2这两种方式中哪一种更好? 151 10.5. 什么是高位字节和低位字节... -
你必须知道的495个C语言问题
2015-10-16 14:14:285.17 说真的,真有机器用非零空指针吗,或者不同类型用不同的表示? 地址0上到底有什么? 5.18 运行时的整数值0转换为指针以后一定是空指针吗? 5.19 如何访问位于机器地址0处的中断向量?如果我将指针值设为0,... -
《你必须知道的495个C语言问题》
2010-03-20 16:41:18内容简介 《你必须知道的495个C语言问题》以问答...5.17 说真的,真有机器用非零空指针吗,或者不同类型用不同的表示? 61 地址0 上到底有什么? 61 5.18 运行时的整数值0转换为指针以后一定是空指针吗? 61 5.19... -
你必须知道的495个C语言问题(高清版)
2010-03-31 16:24:095.17 说真的,真有机器用非零空指针吗,或者不同类型用不同的表示? 61 地址0 上到底有什么? 61 5.18 运行时的整数值0转换为指针以后一定是空指针吗? 61 5.19 如何访问位于机器地址0处的中断向量?如果我将... -
Oracle Database 11g数据库管理艺术--详细书签版
2012-09-30 01:09:453.4.8 UNIX中的输入和输出重定向 41 3.4.9 防止文件被覆盖 41 3.5 UNIX中文件和目录的浏览 42 3.5.1 UNIX系统中的文件 42 3.5.2 链接文件 42 3.5.3 管理文件 42 3.5.4 权限:读/写UNIX的文件 43 ... -
java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心
2018-08-13 11:20:07【*JVM】查看jvm虚拟机里面堆、线程的信息,你用过什么命令? 59 【JVM】垃圾回收算法有哪些? 59 引用计数法(Reference Counting Collector) 59 tracing算法(Tracing Collector) 61 compacting算法(Compacting ... -
asp.net知识库
2015-06-18 08:45:45怎么在ASP.NET 2.0中使用Membership asp.net 2.0-实现数据访问(1) ASP.NET 2.0 新特性 .NET 2.0里使用强类型数据创建多层应用 在MastPage中引用脚本资源 2.0正式版中callback的一些变化+使用示例(ASP.NET 2.0)... -
java面试宝典
2013-02-28 16:04:01129、在JSP中如何执行浏览重定向? 32 130、如何防止在JSP或SERVLET中的输出不被BROWSER保存在CACHE中? 32 131、在JSP中如何设置COOKIE? 32 132、在JSP中如何删除一个COOKIE? 32 133、在一个JSP的请求处理中如何停止... -
千方百计笔试题大全
2011-11-30 21:58:33129、在JSP中如何执行浏览重定向? 32 130、如何防止在JSP或SERVLET中的输出不被BROWSER保存在CACHE中? 32 131、在JSP中如何设置COOKIE? 32 132、在JSP中如何删除一个COOKIE? 32 133、在一个JSP的请求处理中如何停止... -
Visual C++程序员实用大全(精华版).(水利水电.邓劲生.张晓明译).part3
2016-06-21 21:11:381 理解计算机是怎么运行程序的 2 运行一个已解释的程序 3 运行一个已编译的程序 4 C++在哪里 5 理解Visual c++中的程序文件 6 创建源代码文件 7 理解并创建头文件 第二章 结构和语法 8 理解计算机语言 9 理解计算机... -
Visual C++程序员实用大全(精华版).(水利水电.邓劲生.张晓明译).part4
2016-06-21 21:13:271 理解计算机是怎么运行程序的 2 运行一个已解释的程序 3 运行一个已编译的程序 4 C++在哪里 5 理解Visual c++中的程序文件 6 创建源代码文件 7 理解并创建头文件 第二章 结构和语法 8 理解计算机语言 9 理解计算机... -
Visual C++程序员实用大全(精华版).(水利水电.邓劲生.张晓明译).part1
2016-06-21 21:05:541 理解计算机是怎么运行程序的 2 运行一个已解释的程序 3 运行一个已编译的程序 4 C++在哪里 5 理解Visual c++中的程序文件 6 创建源代码文件 7 理解并创建头文件 第二章 结构和语法 8 理解计算机语言 9 理解计算机... -
Visual C++程序员实用大全(精华版).(水利水电.邓劲生.张晓明译).part2
2016-06-21 21:09:541 理解计算机是怎么运行程序的 2 运行一个已解释的程序 3 运行一个已编译的程序 4 C++在哪里 5 理解Visual c++中的程序文件 6 创建源代码文件 7 理解并创建头文件 第二章 结构和语法 8 理解计算机语言 9 理解计算机... -
Linux操作系统基础教程
2013-04-08 21:34:26关於通讯用的指令.........................................................................................................21 十. 编译器( Compiler )....................................................... -
疯狂JAVA讲义
2014-10-17 13:35:01学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不需要指定目标文件的文件名呢? 13 1.5.3 运行Java程序 14 1.5.4 根据... -
网管教程 从入门到精通软件篇.txt
2010-04-25 22:43:49注意:这些结果被静态存储,并用于本次会话。如果在本次会话期间磁盘配置发生变化,为获得更新的扫描,必须先重新启动计算机,然后再次扫描磁盘。 bootcfg /list 列出引导列表中已有的条目。 bootcfg /... -
javascript函数的解释
2011-02-26 11:03:52其实就是搞清做什么,怎么做的问题,先把流程图画出来,拆解开,一个个做好了然后再合并。理论的东西我不会讲,直接举例哈! function g(o){return document.getElementById(o);} function hitover(n) { for(i=1... -
新版Android开发教程.rar
2010-12-14 15:49:11----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 ...• SQLite SQLite SQLite SQLite 用作结构化的数据存储 • 多媒体支持 包括常见的音频、视频和...
-
repne scasb + rep movsd + rep movsb 内联实现 strcat
-
2005-2020信息系统项目管理师历年真题(含上午题、案例分析、论文)试题和答案.rar
-
MySQL 管理利器 mysql-utilities
-
基于SSM实现的房屋租赁系统【附源码】(毕设)
-
MySQL 数据库权限管理(用户高级管理和精确访问控制)
-
如何设置tkinter窗口透明
-
LVS + Keepalived 实现 MySQL 负载均衡与高可用
-
2021年中国新跨境出口B2B电商行业研究报告.pdf
-
MySQL 事务和锁
-
mysql-connector-c++-8.0.23-win32.msi
-
【Python-随到随学】 FLask第一周
-
按字节寻址和按字寻址
-
MySQL 高可用工具 DRBD 实战部署详解
-
gdal2.x生成terrain地形数据-程序及说明.7z
-
Docker从入门到精通
-
Nezzar and Lucky Number
-
深究字符编码的奥秘,与乱码说再见
-
基于电商业务的全链路数据中台落地方案(全渠道、全环节、全流程)
-
19年实务真题下午.pdf
-
leetcode-223