参数扩展  Parameter Expansion

本文简单介绍linux命令行中的参数扩展的部分内容。在实际生物信息学分析中,参数扩展是十分实用的小技巧。可以用来快速处理大量的重命名文件,获取文件路径,获取文件类型,替换文件文件夹的路径等等

参数扩展可以用于对字符串的操作,主要用途包括以下:

  1. 字符串大小写替换
  2. 字符串替换
  3. 字符串删减
  4. 字符串切片
  5. 字符串长度

Case modification 大小写转换

  • ${PARAMETER^} : 第一个字母大写
  • ${PARAMETER^^} : 全部大写
  • ${PARAMETER,} : 第一个字母小写
  • ${PARAMETER,,} : 全部小写
  • ${PARAMETER~} :第一个字母大小写反转
  • ${PARAMETER~~} :全部大小写反转
# 转换大写
$ X="abc"
$ echo ${X^}
Abc
$ echo ${X^^}
ABC

# 转换小写
$ Y="ABC"
$ echo ${Y,}
aBC
$ echo ${Y,,}
abc

# 翻转大小写
$ echo ${X~}
Abc
$ echo ${X~~}
ABC
$ echo ${Y~~}
abc
$ echo ${Y~}
aBC

Substring replace 字符串替换

  • ${PARAMETER/PATTERN/STRING} : 将第一个PATTERN 替换为STRING
  • ${PARAMETER//PATTERN/STRING} : 将所有PATTERN 替换为STRING
  • ${PARAMETER/PATTERN} :删除第一个PATTERN (将第一个PATTERN 替换为nullstring)
  • ${PARAMETER//PATTERN} :删除将所有PATTERN
  • # 从字符串开头开始匹配
  • % 从字符串末尾开始匹配

MYSTRING="xxxxxxxxxx"
echo ${MYSTRING/x/y}
yxxxxxxxxx

echo ${MYSTRING//x/y}
yyyyyyyyyy

echo ${MYSTRING/#x/y} 
yxxxxxxxxx
echo ${MYSTRING/%x/y} 
xxxxxxxxxy

echo ${MYSTRING//x/}
# is equivalent to
echo ${MYSTRING//x}

# change suffix for a file 
MYSTRING="abc.txt"
echo ${MYSTRING/txt/md}
abc.md

# change prefix for a file 
echo ${MYSTRING/abc/edf}
edf.txt

Substring removal  字符串删减

  • ${PARAMETER#PATTERN} :删除第一个PATTERN
  • ${PARAMETER##PATTERN} :删除所有PATTERN
  • ${PARAMETER%PATTERN} :删除第一个PATTERN (从末尾开始)
  • ${PARAMETER%%PATTERN} :删除所有PATTERN (从末尾开始)
$ MYSTRING="This is a simple sentence with some simple words."
$ echo ${MYSTRING#*simple}
sentence with some simple words.

$ echo ${MYSTRING##*simple}
words.

$ echo ${MYSTRING%simple*}
This is a simple sentence with some

$ echo ${MYSTRING%%simple*}
This is a

$ Get name without extension
MYFILEPATH="/home/work/example.txt"
$ echo ${MYFILEPATH%.*}
/home/work/example

# Get extension
$ echo ${MYFILEPATH##*.}
txt

# Get directory name
echo ${MYFILEPATH%/*}
/home/work

# Get filename
$ echo ${MYFILEPATH##*/}
example.txt

String slicing 字符串切片

  • ${PARAMETER:OFFSET} : OFFSET指从起始位置的偏倚
  • ${PARAMETER:OFFSET:LENGTH} : OFFSET指从起始位置的偏倚,可以为空,LENGTH 则指偏移后截取的长度,负数则指截取到到末位前的长度。
a=myfile.txt.gz

echo $a
myfile.txt.gz

echo ${a::-3}
myfile.txt

echo ${a:2}
file.txt.gz

echo ${a:2:-3}
file.txt

String length 字符串长度

${#PARAMETER} : 获取变量所指字符串的长度

$ MYSTRING="abcd"
$ echo ${#MYSTRING} 
4

Indirection 间接指向

  • ${!PARAMETER} `间接指向变量所指字符串所表示点变量
$ A=1
$ B="A"
$ echo $B
A
$ echo ${!B}
1

参考

https://wiki.bash-hackers.org/syntax/pe

https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

文件归档, 压缩与解压缩 – tar/gzip/bgzip/gzip2/zip/zstd

归档与压缩

归档:将多个文件归为一个文件,文件总大小不变

压缩:将一个文件压缩,文件总大小减少

Linux环境下常用的命令包括以下几种:

归档

  • tar -cvf / -xvf

压缩

  • gzip/gunzip
  • bgzip
  • bzip2/bunzip2
  • zstd -z / -d :https://github.com/facebook/zstd

归档并压缩

  • tar -cvzf / tar -xvzf
  • zip/unzip

归档与解归档

使用 tar 命令进行归档:

#将directory_to_archive文件夹归档为achived_files.tar
tar -cvf achived_files.tar directory_to_archive/ 

#解归档
tar -xvf achived_files.tar

压缩与解压缩

有多种选择 包括 gzip , bgzip , bzip2 , zstd 等多种算法,使用方法如下:

gzip file.txt
#test.txt     ->  32M
#test.txt.gz  ->  9.9M
gunzip file.txt.gz

bzip2 file.txt
#test.txt     ->  32M
#test.txt.bz2 ->  8.5M
bunzip2 test.txt.bz2

#commly used methods for compressing genome data : block gzip
bgzip file.txt
#test.txt      ->  32M
#test.txt.gz   ->  11M
gunzip file.txt.gz

#plink2 
zstd -z file.txt
#test.txt       -> 32M
#test.txt.zst   -> 11M
zstd -d file.txt.zst

归档+压缩

上面介绍了单独归档或单独压缩的情况,但实际操过过程中我们一般会归档压缩同步进行,

可以使用tar -cvzf与tar -xvzf来压缩与解压缩(相当于用tar先归档然后用gzip压缩),也可以使用zip与unzip(同时完成归档与压缩)

zip archived_compressed_file file1 file2 ...
unzip archived_compressed_file.zip

tar -cvzf archived_compressed_file.tar.gz directory_to_archive/ 
tar -xvzf archived_compressed_file.tar.gz

Git config与token

config 设置

git config可以用于git的设置,git共有三个不同层级的配置文件,他们作用范围不同,且逐一覆盖上一层

系统级:—system 适用于该系统所有用户,存储位置:/etc/gitconfig

用户级:—global 适用于特定的用户,存储位置:~/.gitconfig

仓库级:—local 适用于某个仓库,存储位置:当前仓库的 .git/config

第一次安装或是想修改用户名和邮件地址时,可以使用如下代码,这个信息主要用于每次提交时识别记录

$ git config --global user.name "gwaslab"
$ git config --global user.email Yunye@gwaslab.com

查看当前设置,以及其存储文件位置:

git config --list --show-origin

Token

简单来说:token就是与github交互时password的替代,安全性更高(但有时也更麻烦)

创建token

在github网站上自己的icon菜单里依次点击即可:

Settings → Developer settings → Personal access token → Generate a personal access token

参考:https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token

不想频繁输入token的设置

在command line提示输入密码时使用之前的token代替password即可

$ git clone <https://github.com/username/repo.git>
Username: your_username
Password: your_token

为了方便可以,可以将输入的token缓存,使用下面的设定后对目前用户的token输入一次后会缓存:

git config --global credential.helper cache 

不需要时可以取消

git config --global --unset credential.helper

Linux :输入/输出重定向 >, 1>, 2>, &>, >> , <<

linux重定向可以将命令的输出或输入重新定向到其他位置或文件,以实现对输出输入的控制。默认情况下命令的输出通常为终端,如果想将输出转移到文件或其他位置,这时候就需要重定向。

文件描述符:一个命令通常都会打开三个文件,默认使用文件描述符0,1,2来指代这个三个文件

stdin   0	标准输入流 (键盘)
stdout	1	标准输出流 (终端)
stderr	2	标准错误输出流 (终端)

输出重定向

输出重定向常见形式:

command > file  #将标准输出1重定向到 file 里
command 1> file #将标准输出1重定向到 file 里,与上面的写法功能一样
command 2> file #将标准错误输出1重定向到 file 里
command &> file #将标准输出1 与 标准错误输出2 一起重定向到 file 里

最简单的用法,将命令的输出重定向到文件里:

$ ls > out.txt #将ls的结果写进out.txt里
$ cat out.txt 
file1.txt
out.txt

当然输出重定向还有其他用法,我们来看下面看这个例子:

当前目录下只有file1.txt这个文件

但我们使用cat命令查看file1.txt和file2.txt,返回终端的结果其实包含两部分

cat file1.txt的标准输出,

cat file2.txt的标准错误输出(因为文件不存在)

$ ls
file1.txt

$ cat file1.txt file2.txt 
1	apple      #标准输出
2	banana     #标准输出
3	pear       #标准输出
4	orange     #标准输出
cat: file2.txt: No such file or directory   #标准错误输出

1> 和 2> 分别重定向标准输出,与标准错误输出

# 单独使用> 或1>将命令的结果重定向到 out.txt文件中
# 此时,只有标准输出被重定向,标准错误输出被直接输出到终端
$ cat file1.txt file2.txt > out.txt
cat: file2.txt: No such file or directory #标准错误输出
$ cat out.txt 
1	apple
2	banana
3	pear
4	orange

# 单独使用2> 时,只有标准错误输出被重定向,标准输出被直接输出到终端
$ cat file1.txt file2.txt 2>out.txt
1	apple
2	banana
3	pear
4	orange
$ cat out.txt 
cat: file2.txt: No such file or directory

&> 为一起重定向标准输出 与 标准错误输出的简便写法

# &> 是指将 标准输出 与 标准错误输出 一起重定向 
$ cat file1.txt file2.txt &> out.txt
$ cat out.txt 
1	apple
2	banana
3	pear
4	orange
cat: file2.txt: No such file or directory

#以上代码等价于 1> out.txt 2>&1
#这里 &1 指代标准输出1
#将标准错误输出2 先定向到标准输出1,然后将标准输出1定向到out.txt文件中
$ cat file1.txt file2.txt 1> out.txt 2>&1
$ cat out.txt 
1	apple
2	banana
3	pear
4	orange
cat: file2.txt: No such file or directory

#等价于
$ cat file1.txt file2.txt 2> out.txt 1>&2
$ cat out.txt 
1	apple
2	banana
3	pear
4	orange
cat: file2.txt: No such file or directory


不覆盖file的输出重定向 >>

command >> file 
#将标准输出1重定向到 file 里, 不替代原本file文件内容,只是在末尾添加

$ cat file1.txt >out.txt #将cat file1的结果输出到out.txt
$ cat out.txt 
1	apple
2	banana
3	pear
4	orange

$ cat file1.txt >>out.txt #将cat file1的结果添加到out.txt末尾,不覆盖源文件
$ cat out.txt  
1	apple
2	banana
3	pear
4	orange
1	apple
2	banana
3	pear
4	orange

>>的其他用法与 >类似, 也可以有 &>> 1>> 2>>等用法:

#将标准输出定向到out.txt,然后将标准错误输出添加到out.txt末尾
$ cat file1.txt file2.txt 1> out.txt 2>>out.txt
(base) [heyunye@gc017 redirection]$ cat out.txt 
1	apple
2	banana
3	pear
4	orange
cat: file2.txt: No such file or directory


输入重定向

与输出重定向类似,将文件内容重定向到标准输入0

command <file  #重定向标准输入
command << xxx  #here document

看下面这个例子,使用head -v 来查看文件,理解其中区别

# 使用head -v命令来查看file1.txt (-v 选项可以输出文件名)
$ head -v file1.txt 
==> file1.txt <==           
1	apple
2	banana
3	pear
4	orange

# 使用重定向,可以看到主体部分相同,但文件名为standard input,因为我们将文件重定向到了标准输入
$ head -v <file1.txt 
==> standard input <==
1	apple
2	banana
3	pear
4	orange

Here document

可以以交互形式实现快捷的多行输入。

<<xxx 这种形式被称为Here document,xxx为任意字符串,作为标签,为Here documen的起始,输入时直接在终端里输入多行内容,完成后再次输入xxx,标记输入完成。

#here document
command <<标签  
>内容
>内容
>...
>标签

$ head -v <<abc #<<abc 是指here document的起始
> 123 #内容
> 123 #内容
> 123 #内容
> abc #abc 表示结束
==> standard input <==  #Here document被定向为标准输入
123
123
123

Linux: 进程替代 >(command) <(command)

进程替换(process substitution):

将临时文件作为某个进程的输入或输出的一种重定向。

<(command) : 将括号()里的命令执行后,输出作为一个临时文件,这个临时文件通常存在 /dev/fd/目录下

>(command) : 将之前命令的输出视为一个临时文件,作为括号()里命令的输入

先看下面这个例子:

$ echo <(ls)  
/dev/fd/63

# 先执行ls命令,结果输出到临时文件中(/dev/fd/63)
# 这里<(ls)就指代这个文件的路径(/dev/fd/63)
# 这个文件的内容是ls命令的结果
# 所以 echo <(ls) 约等于
# echo /dev/fd/63

$ ls > >(cat)
#将ls命令的结果输出到/dev/fd/目录下某个临时文件中
#将临时文件作为括号内命令cat的输入 执行
#结果上和ls单独执行一样

也就是说进程替换实际上就是将进程与/dev/fd/目录下的某个临时文件相关联,然后这个临时文件可作为后续命令的输入输出。

实际操作中,使用进程替换可以大幅简化代码,

诸如下面这个例子:

#分别提取三个文件的第一行,然后paste
$ paste -d' '  <(cut -f 1 file1.txt ) <(cut -f 1 file2.txt ) <(cut -f 1 file3.txt )
1 1 pear 1 pear x
2 2 apple 2 apple y
3 3 banana 3 banana z
4 5 kiwi 5 kiwi q

进程替换可以嵌套

Linux命令:纵向/横向合并文本 cat/paste

cat 和 paste 分别为linux中 纵向 以及 横向合并文本的命令

纵向合并 cat

cat 是 concatenate的缩略,其主要功能是查看文件或纵向合并文件。

对单个文件使用时为查看文件

-n 选项为显示行号

$ cat file1.txt 
1 apple
2 banana
3 pear
4 orange

#-n 第一列输出行号
$ cat -n file1.txt 
     1  1 apple
     2  2 banana
     3  3 pear
     4  4 orange

对多个文件使用时即为纵向合并

$ cat file1.txt 
1 apple
2 banana
3 pear
4 orange

$ cat file2.txt 
1 pear
2 apple
3 banana
5 kiwi

#查看文件1与文件2(也就是将两个文件纵向合并)
$ cat file1.txt file2.txt 
1 apple
2 banana
3 pear
4 orange
1 pear
2 apple
3 banana
5 kiwi

#文件名称仅有数字不同时可以使用以下简略写法
$ cat file[1-2].txt
1 apple
2 banana
3 pear
4 orange
1 pear
2 apple
3 banana
5 kiwi

cat的其他选项


-b	--number-nonblank	添加行号,但空白行不添加
-s	--squeeze-blank	将连续的空白行缩为一行
-v	--show-nonprinting	显示TAB、换行,分页以外的非表示文字
-t	―	显示非表示文字 tab以"^I"显示等
-E	--show-ends	行末以"$"表示
-A	--show-all	显示所有非表示文字(与-vET相同)
-e	―	显示除tab以外的非表示文字(与-vE相同)


横向合并 paste

paste 与cat类似,但是是 逐行 横向 合并(单纯合并,不进行连接,不改变行的顺序,连接的话用join命令)

#合并file1与file2 , 默认的分隔符为tab
$ paste file1.txt file2.txt 
1 apple 1 pear
2 banana        2 apple
3 pear  3 banana
4 orange        5 kiwi

#也可以使用简略写法
paste file[1-2].txt

-d可以指定合并后的分隔符

#指定分隔符为空格
$ paste -d' ' file1.txt file2.txt 
1 apple 1 pear
2 banana 2 apple
3 pear 3 banana
4 orange 5 kiwi

#指定分隔符为,
$ paste -d',' file1.txt file2.txt 
1 apple,1 pear
2 banana,2 apple
3 pear,3 banana
4 orange,5 kiwi

-s 可以实现按字段合并(按行横向合并的转置)

$ paste -d' ' -s file1.txt file2.txt 
1 apple 2 banana 3 pear 4 orange
1 pear 2 apple 3 banana 5 kiwi

Linux命令:连接表格 join

linux中join命令可以对两个相关联表格的文件以某一列为key进行连接。与sql数据库的join概念类似。

  1. Inner join
  2. Left, right, outer join
  3. 指定Key
  4. 指定输出的列
  5. 其它选项

内连接 Inner join

join 默认以第一列为key进行合并,并输出两个文件都有的行(内连接,inner join),最简单的用法如下所示 :

(**注意使用join前应当对要连接的文件使用sort事先进行排序)

$ cat file1.txt 
1 apple
2 banana
3 pear
4 orange

$ cat file2.txt 
1 pear x
2 apple y
3 banana z
5 kiwi q

$ join file1.txt file2.txt 
1 apple pear x
2 banana apple y
3 pear banana z

各种连接的概念示意图:

左/ 右 / 外连接 Left/right/outer join

-a N 输出指定第N个文件的所有行

通过-a选项可以完成left join,right join以及outer join的操作

单独指定-a 1 即为左连接(连接后输出第一个文件里所有的行)

单独指定 -a 2 即为右链接(连接后输出第二个文件里所有的行)

同时制定 -a 1 -a 2 为外连接(连接后输出两个文件里所有的行)

#left join
$ join -a 1 file1.txt file2.txt 
1 apple pear x
2 banana apple y
3 pear banana z
4 orange

#right join
$ join -a 2 file1.txt file2.txt 
1 apple pear x
2 banana apple y
3 pear banana z
5 kiwi q

#outer join
$ join -a 1 -a 2 file1.txt file2.txt 
1 apple pear x
2 banana apple y
3 pear banana z
4 orange
5 kiwi q

Key

join默认使用的key是第一列,

-j N 指定两个文件j合并时所使用的key为第N列

也可以单独指定:

-1 N 指定第一个文件所用key为第N列

-2 N 指定第一个文件所用key为第N列

-e [字符串] 指定的key不存在时,输出“字符串”代替

#因为没有以第二列为key进行排序,所以报错
$ join -j 2 file1.txt file2.txt 
join: file1.txt:4: is not sorted: 4 orange
join: file2.txt:2: is not sorted: 2 apple y
pear 3 1 x

#使用<(your command) 形式可以直接将 your command的结果作为输入
#使用排序后的结果则可以以第二列为key合并
join -j 2 <(sort -k 2 file1.txt)  <(sort -k 2 file2.txt)
apple 1 2 y
banana 2 3 z
pear 3 1 x

#-j 2的效果等同 -1 2 -2 2
join -1 2 -2 2 <(sort -k 2 file1.txt)  <(sort -k 2 file2.txt)
apple 1 2 y
banana 2 3 z
pear 3 1 x

#也可以使用-1 与-2 单独指定

#指定的key不存在时,输出“na”代替
$ join -j 4 -e na file1.txt file2.txt 
na 1 apple 1 pear x
na 1 apple 2 apple y
na 1 apple 3 banana z
na 1 apple 5 kiwi q
na 2 banana 1 pear x
na 2 banana 2 apple y
na 2 banana 3 banana z
na 2 banana 5 kiwi q
na 3 pear 1 pear x
na 3 pear 2 apple y
na 3 pear 3 banana z
na 3 pear 5 kiwi q
na 4 orange 1 pear x
na 4 orange 2 apple y
na 4 orange 3 banana z
na 4 orange 5 kiwi q

Output 指定输出的列

-o 选项可以指定输出的列

格式如下:

单列: ”文件序号.列序号“ ,如 1.1 为第1个文件的第1列

多列:“文件序号.{列序号1,列序号1…}” , 如1.{1,2} 为第1个文件的第1列与第2列

#join后输出第1个文件的第1列,与输出第2个文件的第1列
$ join -o 1.1 2.1 file1.txt file2.txt 
1 1
2 2
3 3
#join后输出第1个文件的第1列,与输出第2个文件的第1,2列
$ join -o 1.1 2.{1,2} file1.txt file2.txt
1 1 pear
2 2 apple
3 3 banana

其他常用的选项

-i 匹配时忽略大小写
--header 将第一行视为header,不进行匹配
-v [指定文件名] 输出与指定文件不一致的行
-t 分隔符 指定读取文件时的分隔符

Linux命令:去除重复的行 uniq

uniq命令主要用于删除文件中重复的行,使用的前提是文件已经使用sort排序后,否则uniq只删除连续重复的行,而非全局删除重复。

主要使用场景:

去除重复的行 (可以忽略大小写)

统计重复的行

uniq的主要选项包括:

-c	--count	统计各行出现的次数
-u	--unique	只输出不重复的行
-d	--repeated	只输出重复的行
-D	--all-repeated	输出全部重复的行
-i	--ignore-case	比较时忽略大小写
-w N	--check-chars=N	只比较行的前N个字符
-s N	--skip-chars=N	比较时略过前N个字符,之比较N个字符后的内容
-f N	--skip-fields=N	比较时略过前N个字段,之比较N个字段后的内容

以以下的文件为例

$ cat test_data.txt 
green
red
white
blue
yellow
black
white
blue
blue

对没有sort排序的文件使用uniq,只删除连续重复的行(两个blue变为一个)

$ uniq test_data.txt 
green
red
white
blue
yellow
black
white
blue

先sort后,再uniq即可全局删除重复 (删去了多余的blue和white)

$ sort test_data.txt | uniq
black
blue
green
red
white
yellow

使用-c可以统计行的重复次数

$ sort test_data.txt | uniq -c
      1 black
      3 blue
      1 green
      1 red
      2 white
      1 yellow

$ sort test_data.txt | uniq -c | sort
      1 black
      1 green
      1 red
      1 yellow
      2 white
      3 blue

使用-w可以只对前n个字符为对象进行删除 ,若n=1 , blue与black 则视为重复:

$ sort test_data.txt | uniq -w 1
black
green
red
white
yellow

Linux命令:排序 sort

sort 是对文件的行进行排序的命令。

常用选项如下:

-f	--ignore-case	不区分大小写
-n	--numeric-sort	视为数值进行排列
-r	--reverse	逆序排列 (从大到小)
-k 指定	--key=指定	指定排序所依据的字段及选项 
-t 文字	--field-separator=文字	指定区分字段的分隔符

以以下文件为例:

$ cat sort_data.txt 
1 a
8 b
3 d
12 c

#默认为以第一列为key 按字符排序
$ sort sort_data.txt 
12 c
1 a
3 d
8 b

#指定-n后以数字大小排序
$ sort -n sort_data.txt 
1 a
3 d
8 b
12 c

指定-r选项后可以逆序排列

$ sort -r sort_data.txt 
8 b
3 d
1 a
12 c

$ sort -nr sort_data.txt 
12 c
8 b
3 d
1 a

-k可以指定排序依据的列

$ sort -k 2 sort_data.txt 
1 a
8 b
12 c
3 d

$ sort -k 2r sort_data.txt 
3 d
12 c
8 b
1 a

-t 指定分隔列的分隔符

$ cat sort_data.csv 
1,4
8,2
3,1
12,13

$ sort -k 2nr -t , sort_data.csv 
12,13
1,4
8,2
3,1

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