1. cat(concatenate)
一个文本文件查看和连接工具,查看一个文件的内容
命令选项
-n 或 --number:由 1 开始对所有输出的行数编号。
-b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号。
-s 或 --squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行。
-v 或 --show-nonprinting:使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外。
-E 或 --show-ends : 在每行结束处显示 $。
-T 或 --show-tabs: 将 TAB 字符显示为 ^I。
-A, --show-all:等价于 -vET。
-e:等价于"-vE"选项;
-t:等价于"-vT"选项
--help:显示此帮助信息并离开
实例
cat -n textfile1 > textfile2
注:把 textfile1 的文档内容加上行号后输入 textfile2 这个文档里
cat -b textfile1 textfile2 >> textfile3
注:把 textfile1 和 textfile2 的文档内容加上行号(空白行不加)之后将内容附加到 textfile3 文档里
cat /dev/null > /etc/test.txt
注:清空 /etc/test.txt 文档内容
注:
dev/null:在类 Unix 系统中,/dev/null 称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个 EOF。
而使用 cat $filename > /dev/null 则不会得到任何信息,因为我们将本来该通过标准输出显示的文件信息重定向到了 /dev/null 中。
使用 cat $filename 1 > /dev/null 也会得到同样的效果,因为默认重定向的 1 就是标准输出。 如果你对 shell 脚本或者重定向比较熟悉的话,应该会联想到 2 ,也即标准错误输出。
如果我们不想看到错误输出呢?我们可以禁止标准错误 cat $badname 2 > /dev/null。
在 Linux shell 脚本中我们经常见到类似于cat << EOF的语句,不熟悉的童鞋可能觉得很奇怪:EOF好像是文件的结束符,用在这里起到什么作用?
EOF是“end of file”,表示文本结束符。
<<EOF
(内容)
EOF
首先必须要说明的是EOF在这里没有特殊的含义,你可以使用FOE或OOO等(当然也不限制在三个字符或大写字符)。
可以把EOF替换成其他东西,意思是把内容当作标准输入传给程序。
结合这两个标识,即可避免使用多行echo命令的方式,并实现多行输出的结果。
接下来,简单描述一下几种常见的使用方式及其作用:
1、cat<<EOF,以EOF输入字符为标准输入结束:
2、cat>filename,创建文件,并把标准输入输出到filename文件中,以ctrl+d作为输入结束:
注意:输入时是没有'>'的。(注:用到>符号时,这个符号是重定向的意思,会覆盖原来文件的内容,没有文件时会自动创建。如果用>>符号,即表示追加内容,不会覆盖原文件内容,只会在原文件内容下面追加你所输入的内容。)
3、cat>filename<<EOF,以EOF作为输入结束,和ctrl+d的作用一样。4、如果在写shell脚本的时候,需要生成一个配置文件,但这配置文件带变量,这时就需要把EOF用单引号括起来,否则变量会被解析掉。而且在写脚本时,EOF后面不能带空格等其它符号,否则会出错。
比如在写脚本时,要求原本不动地把cat下的内容生成到脚本配置文件中,如果EOF不用单引号引起来,就会使下面的${VIP}等变量被解析掉,就造成生成一个错误的配置文件了。下面这个脚本是我需要在生成配置文件时,在cat时去解析变量,这样则不需要使用单引号引起来。
简单例子,以下是写的shell脚本内容:
上面cat是生成linux_cat1.txt文件,下面cat是生成linux_cat2.txt文件。
执行完脚本后,我们cat查看这二个文件。
eg1.
# cat << EOF > test.sh > #!/bin/bash #“shell脚本” > #you Shell script writes here. > EOF
结果:
引用# cat test.sh
#!/bin/bash
#you Shell script writes here.可以看到,test.sh的内容就是cat生成的内容。
cat <<EOF >test.sh 内容 EOF
---就是将内容写入test.sh,之前存在的内容会被覆盖掉。EOF可以换成其他符号比如EEE:cat <<EEE >test.sh 内容 EEEeg2.
// 追加文件,将内容追加到 test.sh 的后面,不会覆盖掉原有的内容。 # cat << EOF >> test.sh 内容 EOF
换一种写法
# cat > test.sh << EOF 内容 EOF
注:EOF只是标识,不是固定的。
# cat << HHH > iii.txt
> sdlkfjksl
> sdkjflk
> asdlfj
> HHH
这里的“HHH”就代替了“EOF”的功能。结果是相同的。
引用# cat iii.txt
sdlkfjksl
sdkjflk
asdlfj*** 在非脚本中,
如果不是在脚本中,我们可以用Ctrl-D输出EOF的标识
# cat > iii.txt
skldjfklj
sdkfjkl
kljkljklj
kljlk
Ctrl-D结果:
引用# cat iii.txt
skldjfklj
sdkfjkl
kljkljklj
kljlk※关于“>”、“>>”、“<”、“<<”等的意思,可自行查看bash的介绍。
2. wc
统计给定文件中的字节数、字数、行数。
如果没有给出文件名,则从标准输入读取。
wc同时也给出所有指定文件的总统计数。字是由空格字符区分开的最大字符串。
命令选项
- c 统计字节数。
- l 统计行数。
- w 统计字数。
这些选项可以组合使用。
输出列的顺序和数目不受选项的顺序和数目的影响。
总是按下述顺序显示并且每项最多一列。
行数、字数、字节数、文件名
如果命令行中没有文件名,则输出中不出现文件名。
$ wc - lcw file1 file2
4 33 file1
7 52 file2
11 11 85 total
实例
1.统计demo目录下,js文件数量:
find demo/ -name "*.js" |wc -l
2.统计demo目录下所有js文件代码行数:
find demo/ -name "*.js" |xargs cat|wc -l 或 wc -l `find ./ -name "*.js"`|tail -n1
3.统计demo目录下所有js文件代码行数,过滤了空行:
find /demo -name "*.js" |xargs cat|grep -v ^$|wc -l
3. tac
反向连接文件(不太常用)
参考:
linux tac命令_Linux tac命令入门_cumo3681的博客-CSDN博客
Getting started with the Linux tac command | Opensource.com
Have Fun