Linux中的cat命令:基本和高级示例

cat 命令的名称来源于单词catenate,此单词的意思是一个接一个地连接起来。cat 命令的用途是连接文件或标准输入并打印,这个命令常用来显示文件内容,或者将 几个文件连接起来显示,或者从标准输入读取内容并显示。

# Let's obtain first some sample data files:
curl -so - dict://dict.org/'d:felidae:gcide' | unexpand -a -t 3 |
  sed -Ee '/^151/,/^[.]/!d;/^[.0-9]/s/.*//' > felidae.txt
curl -so - dict://dict.org/'d:felis:gcide' | unexpand -a -t 3 |
  sed -Ee '/^151/,/^[.]/!d;/^[.0-9]/s/.*//' > felis.txt

# Catenate files
cat felidae.txt felis.txt

如果要将该串联的结果存储在文件中,则必须使用shell重定向:

cat felidae.txt felis.txt > result.txt
cat result.txt

即使它的主要设计目标是连接文件,cat实用程序通常也只使用一个参数来将该文件的内容显示在屏幕上,就像我在上面示例的最后一行中所做的那样。

A.使用带有标准输入的cat命令

当没有任何参数使用时,cat命令将从其标准输入读取数据并将其写入其标准输出 - 这通常是无用的...除非您使用某些选项来转换数据。 我们稍后会讨论几个有趣的选项。

除了文件路径之外,cat命令还将 - 特殊文件名理解为标准输入的别名。 这样,您可以在命令行上给出的文件之间插入从标准输入读取的数据:

# Insert a separator between the two concatenated files
echo '----' | cat felis.txt - felidae.txt

B.使用cat命令和二进制文件

1.加入拆分文件

cat命令不对文件内容做任何假设,因此它将很乐意使用二进制数据。 重新加入由split或csplit命令破坏的文件可能有用的东西。 或者像我们现在一样加入部分下载:

#
# A picture by Von.grzanka (CC-SA 3.0)
# Optimize bandwidth usage by breaking the download in two parts
# (on my system, I observe a 10% gain that way compared to a "full" download)
curl -s -r 0-50000 \
    https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Felis_catus-cat_on_snow.jpg/1024px-Felis_catus-cat_on_snow.jpg \
    -o first-half &
curl -s -r 50001- \
    https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Felis_catus-cat_on_snow.jpg/1024px-Felis_catus-cat_on_snow.jpg \
    -o second-half &
wait

我们现在有两个一半的图像。 您可以使用ImageMagick的显示器或gimp或任何其他能够读取图像文件的软件打开前半部分并看到它“损坏”:

display first-half
# -or-
gimp first-half
# -or-
firefox first-half

如果你研究我使用的curl命令,你会看到这两个部分完全互补。 前半部分是从字节0到50000,后半部分是从字节50001到文件末尾。 它们之间不应该缺少数据。 所以我们只需要将两个部分组合在一起(按正确的顺序)以获取完整的文件:

cat first-half second-half > image.jpg
display image.jpg

2.使用可流式文件格式

您不仅可以使用cat命令“重新加入”分成几个部分的二进制文件,但在某些情况下,您还可以通过这种方式创建新文件。 对于像MPEG传输流视频文件(.TS文件)文件格式,这种方法效果特别好:

# Let's make a still video file from our picture
ffmpeg -y -loop 1 -i cat.jpg -t 3  \
    -c:v libx264 -vf scale=w=800:h=-1 \
    still.ts

# Let's make a fade-in from the same picture
ffmpeg -y -loop 1 -i cat.jpg -t 3  \
    -c:v libx264 -vf scale=w=800:h=-1,fade=in:0:75 \
    fadein.ts

# Let's make a fade-out from the same picture
ffmpeg -y -loop 1 -i cat.jpg -t 3  \
    -c:v libx264 -vf scale=w=800:h=-1,fade=out:0:75 \
    fadeout.ts

我们现在可以使用cat命令组合所有这些传输流视频文件,在输出中获得完全有效的TS文件:

cat fadein.ts still.ts fadeout.ts > video.ts
mplayer video.ts

由于TS文件格式,您可以按照您想要的顺序组合这些文件,甚至可以在参数列表中多次使用相同的文件在输出视频中创建循环或重复。显然,如果我们使用动画图像,这会更有趣,但我会让你自己这样做:许多消费级设备记录TS文件,如果他们不记录,你仍然可以使用ffmpeg转换几乎任何视频文件到传输流文件。不要犹豫,使用评论部分分享您的作品!

3.破解cpio档案

作为最后一个示例,让我们看看如何使用cat命令组合几个cpio档案。但这一次,它不会那么简单,因为它需要一些关于cpio存档文件格式的知识。

cpio存档按顺序存储文件的元数据和内容,这使其适合与cat实用程序进行文件级连接。不幸的是,cpio存档还包含一个用于标记存档结尾的预告片:

# Create two genuine CPIO `bin` archive:
$ find felis.txt felidae.txt | cpio -o > part1.cpio
2 blocks
$ echo cat.jpg | cpio -o > part2.cpio
238 blocks

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/12442.html