linux-command-05 nl和EOF

linux-command-05 nl和EOF

nl

概念解析

  nl是一个LINUX命令,可以为输出列加上编号。nl 提供了非常多的参数使用,可以定义到很细很细的程序来制定它下好编号的输出。

  通俗来讲,nl命令在linux系统中用来计算文件中行号。nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能。

语法

1
nl [选项]... [文件]...

参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-w  :行号栏位的占用的位数。
-p 在逻辑定界符处不重新开始计算。
-b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
-b t :如果有空行,空的那一行不要列出行号(默认值);
-n :列出行号表示的方法,主要有三种:
-n ln :行号在萤幕的最左方显示;
-n rn :行号在自己栏位的最右方显示,且不加 0 ;
-n rz :行号在自己栏位的最右方显示,且加 0 ;
-d, --section-delimiter=CC 使用指定的CC 分割逻辑页数
-f, --footer-numbering=样式 使用指定样式编号文件的页脚行目
-h, --header-numbering=样式 使用指定样式编号文件的页眉行目
-i, --page-increment=数值 设置每一行遍历后的自动递增值
-l, --join-blank-lines=数值 设置数值为多少的若干空行被视作一行
-s, --number-separator=字符串 可能的话在行号后添加字符串
-v, --starting-line-number=数字 每个逻辑页上的第一行的行号

解析

  nl 命令读取 File 参数(缺省情况下标准输入),计算输入中的行号,将计算过的行号写入标准输出。 在输出中,nl 命令根据您在命令行中指定的标志来计算左边的行。 输入文本必须写在逻辑页中。每个逻辑页有头、主体和页脚节(可以有空节)。 除非使用 -p 标志,nl 命令在每个逻辑页开始的地方重新设置行号。 可以单独为头、主体和页脚节设置行计算标志(例如,头和页脚行可以被计算然而文本行不能)。

实例解析

首先准备测试文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@node4 ~]# cat 1.txt 
1 2 3 4 5
6 7 8 9 10
a b c d e
hello world and awk
languege php,java,python
LANGUEGE PHP,JAVA,PYTHON
[root@node4 ~]# cat -n 1.txt
1 1 2 3 4 5
2 6 7 8 9 10
3 a b c d e
4 hello world and awk
5 languege php,java,python
6 LANGUEGE PHP,JAVA,PYTHON
[root@node4 ~]# nl 1.txt
1 1 2 3 4 5
2 6 7 8 9 10
3 a b c d e
4 hello world and awk
5 languege php,java,python
6 LANGUEGE PHP,JAVA,PYTHON
[root@node4 ~]#

可以看到,cat -n具有将输出内容加上行号的功能,nl不加参数时显示的结果和其一模一样。

我们现在在1.txt每一行后面追加一行空行

1
[root@node4 ~]# sed -i 'G' 1.txt

1.显示空行行号和不显示空行行号

1
2
[root@node4 ~]# nl -b a 1.txt
[root@node4 ~]# nl -b t 1.txt

1P0pWV.png

2.让行号前面自动补上0,统一输出格式,用参数-n rz :行号在萤幕的最左方显示。默认的行号为6位数。

1
[root@node4 ~]# nl -b a -n rz 1.txt

3.让行号前面自动补上0,统一输出格式,用参数-n rz :行号在萤幕的最左方显示。设置行号为3位数。

1
[root@node4 ~]# nl -b a -n rz -w 3 1.txt

1P0VoR.png

4.用EOF将标准输入的内容编号

1
2
3
4
5
6
7
8
9
[root@node4 ~]# nl <<EOF
> line1
> line2
> line3
> EOF
1 line1
2 line2
3 line3
[root@node4 ~]#

EOF

概念解析

  EOF是END Of File的缩写,表示自定义终止符。在平时的运维工作中,我们经常会碰到这样一个场景:执行脚本的时候,需要往一个文件里自动输入N行内容。如果是少数的几行内容,还可以用echo追加方式,但如果是很多行,那么单纯用echo追加的方式就显得愚蠢之极了!这个时候,就可以使用EOF结合cat命令进行行内容的追加了。

语法

1
2
3
<<EOF        //开始
....
EOF //结束

实例解析

EOF+cat

1.将输入内容输出显示

1
2
3
4
5
6
7
[root@node4 ~]# cat << EOF
> hello
> world
> EOF
hello
world
[root@node4 ~]#

2.将输入内容输出到2.txt。(不用提前touch创建2.txt,因为EOF输出内容到2.txt时会自动创建2.txt)

1
2
3
4
5
6
7
8
[root@node4 ~]# cat << EOF >2.txt
> hello
> world
> EOF
[root@node4 ~]# cat 2.txt
hello
world
[root@node4 ~]#

3.将输入内容追加到2.txt

1
2
3
4
5
6
7
8
9
10
[root@node4 ~]# cat << EOF >> 2.txt 
> apple
> banana
> EOF
[root@node4 ~]# cat 2.txt
hello
world
apple
banana
[root@node4 ~]#

4.将输入内容覆盖2.txt的原内容

1
2
3
4
5
6
7
8
9
10
[root@node4 ~]# cat  << EOF > 2.txt 
> java
> php
> web
> EOF
[root@node4 ~]# cat 2.txt
java
php
web
[root@node4 ~]#

5.使用自定义的EOF,例如随便起个名字abc

1
2
3
4
5
6
7
8
9
10
11
[root@node4 ~]# cat << abc >> 2.txt 
> python
> scala
> abc
[root@node4 ~]# cat 2.txt
java
php
web
python
scala
[root@node4 ~]#

对比之下,echo的追加和覆盖

可以看到如果要加很多行的话,用echo是很麻烦的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@node4 ~]# echo "hello 14" > 4.txt 
[root@node4 ~]# cat 4.txt
hello 14
[root@node4 ~]# echo "hello 24" >> 4.txt
[root@node4 ~]# cat 4.txt
hello 14
hello 24
[root@node4 ~]# echo "hello 34" >> 4.txt
[root@node4 ~]# cat 4.txt
hello 14
hello 24
hello 34
[root@node4 ~]# echo "hello 44444444" > 4.txt
[root@node4 ~]# cat 4.txt
hello 44444444
[root@node4 ~]#

EOF+nl

  我们将标准输入内容加上行号后再输出到3.txt里面。结果如下,3.txt里面每一行内容都具有了行号,如果此时依然用nl显示3.txt,就会出现两排行号的尴尬情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@node4 ~]# nl << EOF > 3.txt
> hello 13
> hello 23
> hello 33
> EOF
[root@node4 ~]# cat 3.txt
1 hello 13
2 hello 23
3 hello 33
[root@node4 ~]#
[root@node4 ~]# nl 3.txt
1 1 hello 13
2 2 hello 23
3 3 hello 33

EOF+CAT+脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@node4 ~]# vim eof.sh
[root@node4 ~]# cat eof.sh
#!/bin/bash
cat > /root/5.txt << EOF
hello 15
hello 25
hello 35
EOF
[root@node4 ~]# chmod +x eof.sh
[root@node4 ~]# ./eof.sh
[root@node4 ~]# cat 5.txt
hello 15
hello 25
hello 35
[root@node4 ~]#
欢迎打赏,谢谢
------ 本文结束------
0%