奇技淫巧的head和tail命令

tail命令

原理:从文件末尾 倒着 读取内容,直到完成条件后而结束。

大神、小白必要技能,任何命令都实用

tail --help

使用方式

Usage: tail [OPTION]… [FILE]…

Print the last 10 lines of each FILE to standard output.
每一个文件打印最后10行到标准输出(终端、屏幕、文件等; 哎呀,就是输出到能看到内容的地方)

With more than one FILE, precede each with a header giving the file name.
支持多个文件,并且会在每个文件内容输出之前,添加一个带有文件名的标题
~
With no FILE, or when FILE is -, read standard input.
不带有文件或者为“-”,则是从”标准输入“读取(键盘敲入、管道等;只要把内容导入到标准输入即可)

常用参数(-f 参数不讲了,偷懒歇会儿,哈哈哈~)

-c, --bytes=[+]NUM
output the last NUM bytes; or use -c +NUM to output starting with byte NUM of each file;
-c 采用字节的方式;
默认以 反向的方向 输出最后N个字节;
或者使用-c +N参数,以 正向的方向,从第N个字节开始输出;

-n, --lines=[+]NUM
output the last NUM lines, instead of the last 10; or use -n +NUM to output starting with line NUM;
-n 采用行号的方式;
默认以 反向的方向 输出最后N行内容;
或者使用-n +N参数,以 正向的方向, 从第N行开始输出;

NUM may have a multiplier suffix:
b 512, kB 1000, K 1024, MB 1000 * 1000, M 1024 * 1024,
GB 1000 * 1000 * 1000, G 1024 * 1024 * 1024, and so on for T, P, E, Z, Y.
Binary prefixes can be used, too: KiB=K, MiB=M, and so on.
Num可以带有单位,可以选择多倍形式或者二进制形式的单位

千字节(KB), 国际单位制标准,1KB等于1000字节(Byte),基于不同的基数变化(单位字节的多倍形式)(其中“Kilo”前缀表示10的3次方,‌即1000),KB通常用于描述计算机存储容量或数据传输速率等场合;

千位二进制字节(KiB),二进制存储单位的标准命名,1KiB等于1024字节(Byte),基于二进制系统(其中“Kibi”前缀表示210,即1024)
,‌即1024),

‘b’ => 512 (“blocks”)
‘KB’ => 1000(KiloBytes)
‘K’ => 1024 (KibiBytes)
‘MB’ => 10001000 (MegaBytes)
‘M’ => 1024
1024 (MebiBytes)
‘GB’ => 100010001000 (GigaBytes)
‘G’ => 102410241024 (GibiBytes)

实践

示例文本

1.txt 文件,共4行、第一列为行号、第二列为1、第三列为a到d的内容;

11a
21b
31c
41d

十六进制查看1.txt文件,后面会在某个情景下使用该进制查看

00000000  31 31 61 0a 32 31 62 0a  33 31 63 0a 34 31 64 0a  |11a.21b.31c.41d.|
00000010

1. taif -n N 1.txt

查看文件的最后2行的数据
tail -n 2 1.txt
31c
41d

带单位的话,查看文件的最后512行的数据; 单位上述有讲,b等于512,并且以行的方式。
tail -n 1b 1.txt
11a
21b
31c
41d

2. tail -n +N 1.txt

基于"正向的方向" 查看文件,从第二行开始输出到文件末尾
tail -n +2 1.txt
21b
31c
41d
带单位的话,查看文件的从512行的数据,根据示例文本的内容,查不到任何的内容; 
单位上述有讲,b等于512,并且以行的方式。
tail -n +1b 1.txt

3. tail -c N 1.txt

查看文件的最后6个字节内容,从结果只有4个字节,不太对呀,不着急,往下看十六进制输出就明白了。
tail -c 6 1.txt
c
41d

以十六进制方式输出,可以看到真的是6个字节,其中2个是换行(oa),肉眼看不太出来。
如果还不明白,私信我,给传道传道,哈哈。
tail -c 6 1.txt | hexdump -C
00000000  63 0a 34 31 64 0a                                 |c.41d.|
00000006

4. tail -c +N 1.txt

基于"正向的方向" 查看文件,从第3个字节开始输出到文件末尾。
tail -c +3 1.txt
a
21b
31c
41d

以十六进制观察
tail -c +3 1.txt | hexdump -C
00000000  61 0a 32 31 62 0a 33 31  63 0a 34 31 64 0a        |a.21b.31c.41d.|
0000000e

5.某个情景

把编译好的程序和安装脚本放在一个脚本里,预先做好边界或者记录程序大小。执行脚本能把程序分分离出来并执行程序。

采用行号方式, 假如有一个step.sh脚本,脚本中如下内容,可以在linux系统跑跑看
#/bin/bash
LINE=`awk '/^__EOF$/{print NR+1;exit;}' $0`
tail -n +$LINE $0 | base64 -d | bash
exit 0
__EOF
ZWNobyBoZWxsbyB3b3JsZAo=

采用字节方式, 假如有一个step.sh脚本,脚本中如下内容,可以在linux系统跑跑看
#/bin/bash
OFFSET=`awk 'BEGIN{sz=0;}  /^__EOF$/{sz+=length+1;exit;} {sz+=length+1;} END{print sz+1}' $0`
tail -c +$OFFSET $0 | base64 -d | bash
exit 0
__EOF
ZWNobyBoZWxsbyB3b3JsZAo=

总结

  1. tail命令常用在实时查看数据以及最新的一段数据。实时查看数据的话,使用-f参数,它支持两种跟随类型,一种文件描述符,另一种文件名称。以及上面说过的-c/-n参数,不再赘述。
  2. 带单位的行方式(-n),不太好理解,其实就是把大小当成行数执行。
  3. head命令和tail命令的是相反行为,从文件头部读取内容,也有-c/-n参数,但只带有’-',代表反向的方向; 就不展示head的魅力所在了,自己尝试尝试就明白了。

-c, --bytes=[-]NUM
print the first NUM bytes of each file;
with the leading ‘-’, print all but the last NUM bytes of each file;
-c 采用字节的方式;
默认以 正向的方向 输出N个字节;
或者使用-c -N参数,以 反向的方向,从第N+1个字节开始输出;

-n, --lines=[-]NUM
print the first NUM lines instead of the first 10;
with the leading ‘-’, print all but the last NUM lines of each file
-n 采用行号的方式;
默认以 正向的方向 输出N行内容;
或者使用-n +N参数,以 反向的方向, 从第N+1行开始输出;

—越简单,易接受。在折腾路上…

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值