Linux 命令:查看文件开头与末尾 head 与 tail

head 与 tail 分别为显示文件开头以及末尾的命令,是linux最常用的命令之一:

主要有以下选项:

-n 显示的行数
-v verbose 输出文件名的header
-q 不输出文件名的header
-f follow tail专用,可以实时监控文件末尾

以以下有11行的示例数据为例 head 默认可以查看文件的前十行:

$ cat test.txt 
a 1
b 2
c 3
d 4
e 5
f 6
g 7
h 8
i 9
j 10
k 11

#head 查看开头,默认为十行
$ head test.txt 
a 1
b 2
c 3
d 4
e 5
f 6
g 7
h 8
i 9
j 10

#tail 查看末尾,默认为十行
$ tail test.txt
b 2
c 3
d 4
e 5
f 6
g 7
h 8
i 9
j 10
k 11

head与 tail 使用 -n 选项可以 指定显示的行数

$ head -n 5 test.txt 
a 1
b 2
c 3
d 4
e 5

tail -n 5 test.txt
g 7
h 8
i 9
j 10
k 11

-v verbose 输出时第一行显示文件名

head -v test.txt 
==> test.txt <==
a 1
b 2
c 3
d 4
e 5
f 6
g 7
h 8
i 9
j 10


head , tail可以对多个文件使用

head test.txt test2.txt 
==> test.txt <==
a 1
b 2
c 3
d 4
e 5
f 6
g 7
h 8
i 9
j 10

==> test2.txt <==
aaaaaa 123
aaaaab 234
aaabcd 345

使用-q (quiet)则不显示header

head -q test.txt test2.txt 
a 1
b 2
c 3
d 4
e 5
f 6
g 7
h 8
i 9
j 10
aaaaaa 123
aaaaab 234
aaabcd 345

-f (follow) tail有一个额外的选项,可以实时监控文件的末尾(例如监视一个实时输出的log文件)

tail -f test.log

head 与tail组合 可以查看文件的任意行

$ head -n 7 test.txt |tail -n 1
g 7

Linux命令:替换与删除 tr

tr 在linux命令中是 translate的缩略,主要用于对单个字符的替换或是删除 (作用对象是单个字符,或字符集,不能替换单词)

tr的语法
tr [选项] 文字集1 [文字集2]
-d	--delete	删除包含在字符集里的字符
-s	--squeeze-repeats	压缩包含在字符集里的字符
-c	--complement	对象为字符集以外的字符

tr 不能直接输入文件名,需要使用管道 | 输入数据

下面的例子中将文件里的a,b,c,替换为1,2,3

$ cat test.txt 
abc 1
bcd 2
cde 3
def 4
efg 5

$ cat test.txt | tr abc 012
012 1
12d 2
2de 3
def 4
efg 5

可以使用A-Z等缩略形式,下面的例子将文件中小写字母转换成大写字母

$ cat test.txt | tr a-z A-Z
ABC 1
BCD 2
CDE 3
DEF 4
EFG 5

压缩多个相同字符 (-s)

-s 选项可以压缩多个相同字符为一个,可以用来消除多余空格等操作

$ cat test2.txt 
aaaaaa 123
aaaaab 234
aaabcd 345

$cat test2.txt | tr -s a 
a 123
ab 234
abcd 345

删除字符 (-d)

-d 选项可以删除指定的字符

$ cat test2.txt | tr -d a 
 123
b 234
bcd 345

Linux命令:提取列 cut

cut命令可用来提取文件中某一列或某些列, 列的定义可以通过字节(bytes, -b)数,字符(character, -c)数,或者字段(field, -f)数, 这三种定义分别对应以下三种选项,使用时必须指定其一:

-b bytes
-c character
-f field

如果不指定的话会报错
cut test.txt 
cut: you must specify a list of bytes, characters, or fields
Try 'cut --help' for more information.

单列提取

$cat test.txt 
abc 1
bcd 2
cde 3
def 4
efg 5

#提取第二列(字节)
$ cut -c 2 test.txt 
b
c
d
e
f

#提取第二列(字符)
$ cut -b 2 test.txt 
b
c
d
e
f

#提取第二列(字段)
cut -f 2 -d ' ' test.txt 
1
2
3
4
5

注: 使用 -f 时可以通过-d 指定分隔符

多列提取 (以 -b 为例,-c,-f 一样)

可以以 间隔要选取的列,例如 -b 1,3,也可以通过-指定范围,如-b 1-3,或是两者组合,-b 1-3,5

当要选取从0到第N列时,可以用 -b -N ,第N列到末尾可以用-b N-

(注:这里的区间全部都为闭区间,即包含起点以及终点的列)

cut -b 1,3 test.txt 
ac
bd
ce
df
eg

cut -b 1-3 test.txt 
abc
bcd
cde
def
efg

cut -b 1-3,5 test.txt 
abc1
bcd2
cde3
def4
efg5

$ cut -b -2 test.txt 
ab
bc
cd
de
ef

cut -b 2- test.txt 
bc 1
cd 2
de 3
ef 4
fg 5

多文件提取

cut可以同时对多个文件进行提取,输出时纵向连接

$ cat test.txt 
abc 1
bcd 2
cde 3
def 4
efg 5

$ cat test2.txt 
abc 123
bcd 234
cde 345

$cut -b 2 test.txt test2.txt 
b
c
d
e
f
b
c
d

Linux命令:逆序输出 tac 与 rev

tac 和 rev 命令都是将文件逆序输出的命令:

tac : 从最后一行开始,以整行为单位逆序输出 (行内内容不变,行顺序颠倒)

rev : 对文件的各个行的文字,逐一逆序输出 (行内内容倒序,行顺序不变)

tac 示例如下:

$ cat test.txt 
a 1
b 2
c 3
d 4
e 5
f 6
g 7
h 8
i 9
j 10

$ tac test.txt 
j 10
i 9
h 8
g 7
f 6
e 5
d 4
c 3
b 2
a 1


类似cat,tac也可以建多个文件逆序输出的结果拼接

cat test2.txt 
abc 123
bcd 234
cde 345

tac test.txt test2.txt 
j 10
i 9
h 8
g 7
f 6
e 5
d 4
c 3
b 2
a 1
cde 345
bcd 234
abc 123

rev的示例如下

$ rev test.txt
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
9 i
01 j

当然可以将tac与rev结合管道使用,完成倒背如流式输出

tac test.txt |rev
01 j
9 i
8 h
7 g
6 f
5 e
4 d
3 c
2 b
1 a

附录:tac 的选项

-s 	--separator=分隔符(默认为换行)
-r	--regex	使用正则表达式匹配分隔符