Linux文本查看及处理.md

cat

cat命令的用途是连接文件或标准输入并打印。这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用。

主要功能

  • 一次显示整个文件:cat filename

  • 从键盘创建一个文件:cat > filename 只能创建新文件,不能编辑已有文件.

  • 将几个文件合并为一个文件:cat file1 file2 > file

命令参数

  • -A, --show-all 等于-vET

  • -b, --number-nonblank 对非空输出行编号

  • -e 等于-vE

  • -E, --show-ends 在每行结束处显示"$"

  • -n, --number 对输出的所有行编号

  • -s, --squeeze-blank 不输出多行空行

  • -t 与-vT 等价

  • -T, --show-tabs 将跳格字符显示为^I

  • -u (被忽略)

  • -v, --show-nonprinting 使用^ 和M- 引用,除了LFD和 TAB 之外

举例

把a.txt 和 2.txt 的文件内容加上行号(空白行不加)之后将内容附加到cc.txt 里:

# cat -b a.txt 2.txt > cc.txt
# cat cc.txt
     1  a
     2  b

     3  ==
     4  1
     5  2

     6  ==

向已存在的文件或新文件追加内容的:

# cat > test.txt << EOF
> Hello
> world
> EOF
# cat test.txt 
Hello
world
# cat >> test.txt << EOF
> next
> EOF
# cat test.txt 
Hello
world
next

注意在cat 后跟>和>>是不一样的,前者是覆盖而后者是追加。所以在使用的时候一定要注意,一旦弄错就会造成文件的内容丢失。这种使用经常出现在shell脚本上今后写脚本会经常用到这个功能。

more

Linux more 命令类似 cat ,不过会以一页一页的形式显示,更方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能(与 vi 相似),使用中的说明文件,请按 h 。

命令参数

  • -num 一次显示的行数

  • +num 从第 num 行开始显示

  • -d 提示使用者,在画面下方显示 [Press space to continue, 'q' to quit.] ,如果使用者按错键,则会显示 [Press 'h' for instructions.] 而不是 '哔' 声

  • -l 取消遇见特殊字元 ^L(送纸字元)时会暂停的功能

  • -f 计算行数时,以实际上的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上)

  • -p 不以卷动的方式显示每一页,而是先清除萤幕后再显示内容

  • -c 跟 -p 相似,不同的是先显示内容再清除其他旧资料

  • -s 当遇到有连续两行以上的空白行,就代换为一行的空白行

  • -u 不显示下引号 (根据环境变数 TERM 指定的 terminal 而有所不同)

  • +/pattern 在每个文档显示前搜寻该字串(pattern),然后从该字串之后开始显示

  • fileNames 欲显示内容的文档,可为复数个数

交互操作

  • Enter 向下n行,需要定义。默认为1行

  • Ctrl+F 向下滚动一屏

  • 空格键 向下滚动一屏

  • Ctrl+B 返回上一屏

  • = 输出当前行的行号

  • :f 输出文件名和当前行的行号

  • V 调用vi编辑器

  • !命令 调用Shell,并执行命令

  • q 退出more

less

less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。less 的用法比起 more 更加的有弹性。在 more 的时候,我们并没有办法向前面翻, 只能往后面看,但若使用了 less 时,就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。

参数

  • -b <缓冲区大小> 设置缓冲区的大小

  • -e 当文件显示结束后,自动离开

  • -f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件

  • -g 只标志最后搜索的关键词

  • -i 忽略搜索时的大小写

  • -m 显示类似more命令的百分比

  • -N 显示每行的行号

  • -o <文件名> 将less 输出的内容在指定文件中保存起来

  • -Q 不使用警告音

  • -s 显示连续空行为一行

  • -S 行过长时间将超出部分舍弃

  • -x <数字> 将"tab"键显示为规定的数字空格

  • /字符串:向下搜索"字符串"的功能

  • ?字符串:向上搜索"字符串"的功能

  • n:重复前一个搜索(与 / 或 ? 有关)

  • N:反向重复前一个搜索(与 / 或 ? 有关)

  • b 向后翻一页

  • d 向后翻半页

  • h 显示帮助界面

  • Q 退出less 命令

  • u 向前滚动半页

  • y 向前滚动一行

  • 空格键 滚动一行

  • 回车键 滚动一页

  • [pagedown]: 向下翻动一页

  • [pageup]: 向上翻动一页

全屏导航

ctrl + F - 向前移动一屏
ctrl + B - 向后移动一屏
ctrl + D - 向前移动半屏
ctrl + U - 向后移动半屏

单行导航

  • j - 向前移动一行

  • k - 向后移动一行

其它导航

  • G - 移动到最后一行

  • g - 移动到第一行

  • q / ZZ - 退出 less 命令

其它有用的命令

  • v - 使用配置的编辑器编辑当前文件

  • h - 显示 less 的帮助文档

  • &pattern - 仅显示匹配模式的行,而不是整个文件

标记导航

当使用 less 查看大文件时,可以在任何一个位置作标记,可以通过命令导航到标有特定标记的文本位置:

  • ma - 使用 a 标记文本的当前位置

  • 'a - 导航到标记 a 处

浏览多个文件

方式一,传递多个参数给 less,就能浏览多个文件。

less file1 file2

方式二,正在浏览一个文件时,使用 :e 打开另一个文件。

less file1
:e file2

当打开多个文件时,使用如下命令在多个文件之间切换

:n - 浏览下一个文件
:p - 浏览前一个文件

less 版 tail -f
在 Linux 动态查看日志文件常用的命令非 tail -f 莫属,其实 less 也能完成这项工作,使用 F 命令。 使用 less file-name 打开日志文件,执行命令 F,可以实现类似 tail -f 的效果。

head

head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾。

命令参数:

  • -q 不显示包含给定文件名的文件头

  • -v 总是显示包含给定文件名的文件头(默认)

  • -c<字节> 每个文件显示开头K字节。若使用了-K,则显示文件全部内容,除去最后K字节

  • -n<行数> 每个文件显示开头K行。若使用了-K,则显示文件全部内容,除去最后K行

tail

tail 命令从指定点开始将文件写到标准输出。使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不断刷新,使你看到最新的文件内容。

命令参数

  • -f 循环读取

  • -q 不显示处理信息

  • -v 显示详细的处理信息

  • -c<数目> 显示的字节数

  • -n<行数> 显示行数

  • --pid=PID 与-f合用,表示在进程ID,PID死掉之后结束.

  • -q, --quiet, --silent 从不输出给出文件名的首部

  • -s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒

tac

tac 是将 cat 反写过来,所以他的功能就跟 cat 相反,cat 是由第一行到最后一行连续显示在萤幕上,而 tac 则是由最后一行到第一行反向在萤幕上显示出来!

  • -b, --before 在行前而非行尾添加分隔标志

  • -r, --regex 将分 隔标志视作正则表达式来解析

  • -s, --separator=字符串 使用指定字符串代替换行作为分隔标志

nl

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

命令参数

  • -b, --body-numbering=样式 使用指定样式编号文件的正文行目

  • -d, --section-delimiter=CC 使用指定的CC 分割逻辑页数

  • -f, --footer-numbering=样式 使用指定样式编号文件的页脚行目

  • -h, --header-numbering=样式 使用指定样式编号文件的页眉行目

  • -i, --page-increment=数值 设置每一行遍历后的自动递增值

  • -l, --join-blank-lines=数值 设置数值为多少的若干空行被视作一行

  • -n, --number-format=格式 根据指定格式插入行号

  • -p, --no-renumber 在逻辑页数切换时不将行号值复位

  • -s, --number-separator=字符串 可能的话在行号后添加字符串

  • -v, --starting-line-number=数字 每个逻辑页上的第一行的行号

  • -w, --number-width=数字 为行号使用指定的栏数

使用举例

让行号前面自动补上0,统一输出格式

# nl -b a -n rz log.txt 
000001    Hello
000002    World
000003    Linux
000004    Hello
000005    World
000006    Linux

nl -b a -n rz 命令行号默认为六位,要调整位数可以加上参数 -w 3 调整为3位。

#  nl -b a -n rz -w 3 log.txt 
001    Hello
002    World
003    Linux
004    Hello
005    World
006    Linux

od

od命令用于输出文件的八进制、十六进制或其它格式编码的字节,通常用于显示或查看文件中不能直接显示在终端的字符。 常见的文件为文本文件和二进制文件。此命令主要用来查看保存在二进制文件中的值。比如,程序可能输出大量的数据记录,每个数据是一个单精度浮点数。这些数据记录存放在一个文件中,如果想查看下这个数据,这时候od命令就派上用场了。在我看来,od命令主要用来格式化输出文件数据,即对文件中的数据进行无二义性的解释。不管是IEEE754格式的浮点数还是ASCII码,od命令都能按照需求输出它们的值。

参数

  • -A, --address-radix=初始偏移 设置要显示的文件的初始偏移量

  • -j, --skip-bytes=字节数 略过指定字节数的输入内容

  • -N, --read-bytes=字节数 限制要转储的输入字节为指定的字节数

  • -S, --strings[=字节数] 输出至少包含指定字节数的字符相应的字串

  • -t, --format=类型 选取输出格式类型

  • -v, --output-duplicates 不使用"*"字符标记屏蔽的行

  • -w, --width[=字节数] 每一行只输出指定的字节数

  • -a 即 -t a, 使用命名的字符,忽略高阶位

  • -b 即 -t o1,使用八进制单字节字符

  • -c 即 -t c, 使用ASCII 字符,或者反斜杠正名的特殊字符

  • -d 即 -t u2,使用无符号十进制双字节字符

  • -f 即 -t fF,指定浮点数对照输出格式

  • -i 即 -t dl,指定十进制整数对照输出格式

  • -l 即 -t dL,指定十进制长整数对照输出格式

  • -o 即 -t o2,指定双字节单位八进制数的对照输出格式

  • -s 即 -t d2,指定双字节单位十进制数的对照输出格式

  • -x 即 -t x2,指定双字节单位十六进制数的对照输出格式

diff

diff 命令主要用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方。diff在命令行中打印每一个行的改动。最新版本的diff还支持二进制文件。diff程序的输出被称为补丁 (patch),因为Linux系统中还有一个patch程序,可以根据diff的输出将a.c的文件内容更新为b.c。diff是svn、cvs、git等版本控制工具不可或缺的一部分。
diff命令能比较单个文件或者目录内容。如果指定比较的是文件,则只有当输入为文本文件时才有效。以逐行的方式,比较文本文件的异同处。如果指定比较的是目录的的时候,diff 命令会比较两个目录下名字相同的文本文件。列出不同的二进制文件、公共子目录和只在一个目录出现的文件。

命令参数

  • -a或--text  diff预设只会逐行比较文本文件。

  • -b或--ignore-space-change  不检查空格字符的不同。

  • -B或--ignore-blank-lines  不检查空白行。

  • -c  显示全部内文,并标出不同之处。

  • -C或--context  与执行"-c-"指令相同。

  • -d或--minimal  使用不同的演算法,以较小的单位来做比较。

  • -D或ifdef  此参数的输出格式可用于前置处理器巨集。

  • -e或--ed  此参数的输出格式可用于ed的script文件。

  • -f或-forward-ed  输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处。

  • -H或--speed-large-files  比较大文件时,可加快速度。

  • -l或--ignore-matching-lines  若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异。

  • -i或--ignore-case  不检查大小写的不同。

  • -l或--paginate  将结果交由pr程序来分页。

  • -n或--rcs  将比较结果以RCS的格式来显示。

  • -N或--new-file  在比较目录时,若文件A仅出现在某个目录中,预设会显示:Only in目录:文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。

  • -p  若比较的文件为C语言的程序码文件时,显示差异所在的函数名称。

  • -P或--unidirectional-new-file  与-N类似,但只有当第二个目录包含了一个第一个目录所没有的文件时,才会将这个文件与空白的文件做比较。

  • -q或--brief  仅显示有无差异,不显示详细的信息。

  • -r或--recursive  比较子目录中的文件。

  • -s或--report-identical-files  若没有发现任何差异,仍然显示信息。

  • -S或--starting-file  在比较目录时,从指定的文件开始比较。

  • -t或--expand-tabs  在输出时,将tab字符展开。

  • -T或--initial-tab  在每行前面加上tab字符以便对齐。

  • -u,-U或--unified=  以合并的方式来显示文件内容的不同。

  • -v或--version  显示版本信息。

  • -w或--ignore-all-space  忽略全部的空格字符。

  • -W或--width  在使用-y参数时,指定栏宽。

  • -x或--exclude  不比较选项中所指定的文件或目录。

  • -X或--exclude-from  您可以将文件或目录类型存成文本文件,然后在=中指定此文本文件。

  • -y或--side-by-side  以并列的方式显示文件的异同之处。

  • --help  显示帮助。

  • --left-column  在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。

  • --suppress-common-lines  在使用-y参数时,仅显示不同之处。

diff 比较文件和目录的说明:

  • FILE1 FILE2 :源是一个文件,目标也是文件。这两个文件必须是文本文件。以逐行的方式,比较文本文件的异同处。

  • DIR1 DIR2 :源是一个目录,目标是目录。diff 命令会比较两个目录下名字相同的文本文件,依照字母次序排序,列出不同的二进制文件,列出公共子目录,列出只在一个目录出现的文件。

  • FILE DIR :源是一个文件,目标是目录。diff命令把源文件与目标目录下的同名文件比较。

  • DIR FILE :源是一个目录,目标是文件(不是目录)。源目录下所有文件中与目标文件同名的文件,将用来与目标文件比较。

diff 输出结果说明:

  • n1 a n2:表示第一个文件的 n1行添加输出内容后成为第二个文件的n2行。

  • n1,n2 c n3,n4:表示将第一个文件的n1到n2行(在<号之 后的内容)改变成第二个文件的n3到n4行(在 >号之后的内容)。

  • n1,n2 d n3:表示第一个文件中n1到n2行删除成 为文件2中的n3行。
    字母a:表示附加(add)
    字符c:表示修改(change)
    字符d:表示删除(delete)

应用举例

# cat a.txt 
2013-01 
2013-02 
2014-03 
2013-04 
2013-05 
2013-06 
2013-07 
2013-07 
2013-09 
2013-10 
2013-11 
2013-12 
# cat b.txt 
2013-01 
2013-02 
2013-03 
2013-04 
2013-05 
2013-06 
2013-07 
2013-08 
2013-09 
2013-10 

比较两个文件:

# diff a.txt b.txt 
3c3
< 2014-03 
---
> 2013-03 
8c8
< 2013-07 
---
> 2013-08 
11,12d10
< 2013-11 
< 2013-12 

说明:3c3和8c8表示俩文件的第三行和第八行的内容不同。11,12d10 表示第一个文件比第二个文件多了第11和12行。

并排格式输出:

# diff -y -W 50 a.txt b.txt 
2013-01         2013-01 
2013-02         2013-02 
2014-03           |    2013-03 
2013-04         2013-04 
2013-05         2013-05 
2013-06         2013-06 
2013-07         2013-07 
2013-07           |    2013-08 
2013-09         2013-09 
2013-10         2013-10 
2013-11           <
2013-12           <

说明:
“|”表示前后2个文件内容有不同
“<”表示后面文件比前面文件少了1行内容
“>”表示后面文件比前面文件多了1行内容

上下文输出格式:

# diff -c b.txt a.txt 
*** b.txt    2016-03-08 17:45:08.866780866 +0800
--- a.txt    2016-03-08 17:43:40.577449364 +0800
***************
*** 1,10 ****
  2013-01 
  2013-02 
! 2013-03 
  2013-04 
  2013-05 
  2013-06 
  2013-07 
! 2013-08 
  2013-09 
  2013-10 
--- 1,12 ----
  2013-01 
  2013-02 
! 2014-03 
  2013-04 
  2013-05 
  2013-06 
  2013-07 
! 2013-07 
  2013-09 
  2013-10 
+ 2013-11 
+ 2013-12 

说明:
这种方式在开头两行作了比较文件的说明,这里有三中特殊字符:
“+” 比较的文件的后者比前着多一行
“-” 比较的文件的后者比前着少一行
“!” 比较的文件两者有差别的行

合并格式输出:

# diff -u a.txt b.txt 
--- a.txt    2016-03-08 17:43:40.577449364 +0800
+++ b.txt    2016-03-08 17:45:08.866780866 +0800
@@ -1,12 +1,10 @@
 2013-01 
 2013-02 
-2014-03 
+2013-03 
 2013-04 
 2013-05 
 2013-06 
 2013-07 
-2013-07 
+2013-08 
 2013-09 
 2013-10 
-2013-11 
-2013-12 

说明:它的第一部分,也是文件的基本信息
--- a.txt 2016-03-08 17:43:40.577449364 +0800
+++ b.txt 2016-03-08 17:45:08.866780866 +0800
"---"表示变动前的文件,"+++"表示变动后的文件。
第二部分,变动的位置用两个@作为起首和结束。
   @@ -1,12 +1,10 @@
前面的"-1,12"分成三个部分:减号表示第一个文件(即a.txt),"1"表示第1行,"12"表示连续12行。合在一起,就表示下面是第一个文件从第1行开始的连续12行。同样的,"+1,10"表示变动后,成为第二个文件从第1行开始的连续10行。

比较两个文件不同,并生产补丁:

# diff -ruN a.txt b.txt >1.log
# cat 1.log 
--- a.txt    2016-03-08 17:43:40.577449364 +0800
+++ b.txt    2016-03-08 17:45:08.866780866 +0800
@@ -1,12 +1,10 @@
 2013-01 
 2013-02 
-2014-03 
+2013-03 
 2013-04 
 2013-05 
 2013-06 
 2013-07 
-2013-07 
+2013-08 
 2013-09 
 2013-10 
-2013-11 
-2013-12 

打补丁:
# cat a.txt 
2013-01 
2013-02 
2014-03 
2013-04 
2013-05 
2013-06 
2013-07 
2013-07 
2013-09 
2013-10 
2013-11 
2013-12 
# cat b.txt 
2013-01 
2013-02 
2013-03 
2013-04 
2013-05 
2013-06 
2013-07 
2013-08 
2013-09 
2013-10 
# cat 1.log 
--- a.txt    2016-03-08 17:43:40.577449364 +0800
+++ b.txt    2016-03-08 17:45:08.866780866 +0800
@@ -1,12 +1,10 @@
 2013-01 
 2013-02 
-2014-03 
+2013-03 
 2013-04 
 2013-05 
 2013-06 
 2013-07 
-2013-07 
+2013-08 
 2013-09 
 2013-10 
-2013-11 
-2013-12 
# pat
patch    pathchk  
# patch b.txt 1.log 
patching file b.txt
Reversed (or previously applied) patch detected!  Assume -R? [n] y
# cat b.txt
2013-01 
2013-02 
2014-03 
2013-04 
2013-05 
2013-06 
2013-07 
2013-07 
2013-09 
2013-10 
2013-11 
2013-12 

说明:若系统没有安装patch命令则需要yum安装。

cut

cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的。

语法

cut  [-bn] [file] 或 cut [-c] [file]  或  cut [-df] [file]

说明:cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。 如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b 字节(bytes)、-c 字符(characters)或 -f 域(fields)标志来进行定为。

参数

  • -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。

  • -c :以字符为单位进行分割。

  • -d :自定义分隔符,默认为制表符。

  • -f :与-d一起使用,指定显示哪个区域。

  • -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的
    范围之内,该字符将被写出;否则,该字符将被排除。

使用举例

以“字节”定位

[root@hpf-linux ~]# w
 23:09:18 up  1:58,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.0.103    21:31    1.00s  0.31s  0.07s w
[root@hpf-linux ~]# w |cut -b 3
3
E
o

上面是提取每一行的第3个字节,如果“字节”定位中,我想提取第3,第4、第5和第8个字节,怎么办? -b支持形如3-5的写法,而且多个定位之间用逗号隔开就成了。看看例子吧:

[root@hpf-linux ~]#  cut -b 3-5,8 /etc/passwd |head -2
ot:0
n:x:

注意:cut命令如果使用了-b选项,那么执行此命令时,cut会先把-b后面所有的定位的位置进行从小到大排序,然后再提取。注意若是将后面定位的位置打乱并不会影响提取顺序。类是3-5这种写法的还有-3表示从第一个字节到第三个字节,而3-表示从第三个字节到行尾。你可以看到这两种情况下,都包括了第三个字节“c”。 如果我执行w|cut -b -3,3-,你觉得会如何呢?答案是输出整行,不会出现连续两个重叠的c的。

以“字符”定位

提取第3,第4,第5和第8个字符:

[root@hpf-linux ~]#  cut -c 3-5,8 /etc/passwd |head -2
ot:0
n:x:

通过上面看出和-b没有什么区别,两者看似相同,其实是不一样的。这只是因为这个例子举的不好,输出的都是单字节字符,所以用-b和-c没有区别,如果你提取中文,区别就看出来了,看看中文提取的情况:

[root@hpf-linux test]# cut -b3 test.txt

°
¬
[root@hpf-linux test]# cut -c3 test.txt
师
师
师

看到了吧,用-c则会以字符为单位,输出正常;而-b只会傻傻的以字节(8位二进制位)来计算,输出就是乱码。 既然提到了这个知识点,就再补充一句,如果你学有余力,就提高一下。 当遇到多字节字符时,可以使用-n选项,-n用于告诉cut不要将多字节字符拆开。例子如下:

[root@hpf-linux test]# cut -nb1-2 test.txt



[root@hpf-linux test]# cut -nb1-3 test.txt
敌
地
召
[root@hpf-linux test]# cut -nb4-6 test.txt
法
卜
唤
[root@hpf-linux test]# cut -nb1-9 test.txt
敌法师
地卜师
召唤师
[root@hpf-linux test]# cat /etc/sysconfig/i18n 
LANG="zh_CN.UTF-8"

注意:通过上面的例子可以看出要想以字节的方式输出中文就需要指定字节的长度,而本例是用UTF-8格式所以占3个字节。

以“域”定位

为什么会有“域”的提取呢,因为刚才提到的-b和-c只能在固定格式的文档中提取信息,而对于非固定格式的信息则束手无策。这时候“域”就派上用场了。如果你观察过/etc/passwd文件,你会发现,它并不像who的输出信息那样具有固定格式,而是比较零散的排放。但是,冒号在这个文件的每一行中都起到了非常重要的作用,冒号用来隔开每一个项。cut命令提供了这样的提取方式,具体的说就是设置“间隔符”,再设置“提取第几个域”,就OK了!

[root@hpf-linux test]# cat /etc/passwd|head -n 5|cut -d : -f -2,5-7
root:x:root:/root:/bin/bash
bin:x:bin:/bin:/sbin/nologin
daemon:x:daemon:/sbin:/sbin/nologin
adm:x:adm:/var/adm:/sbin/nologin
lp:x:lp:/var/spool/lpd:/sbin/nologin

如果遇到空格和制表符时,怎么分辨呢?有时候制表符确实很难辨认,有一个方法可以看出一段空格到底是由若干个空格组成的还是由一个制表符组成的。

[root@hpf-linux test]# cat cut_table.txt
this is      finish.
this is several space      finish.
[root@hpf-linux test]# sed -n l cut_table.txt 
this is \t finish.$
this is several space      finish.$

如果是制表符(TAB),那么会显示为\t符号,如果是空格,就会原样显示。 通过此方法即可以判断制表符和空格了。
注意,上面sed -n后面的字符是L的小写字母,不要看错。要是遇到需要处理的文本有大量的空格和制表符时使用cut就不是很合适了,所以在遇到这种情况使用awk来进行处理。

sort

Sort是用于对单个或多个文本文件内容进行排序的Linux程序。Sort命令以空格作为字段分隔符,将一行分割为多个关键字对文件进行排序。需要注意的是除非你将输出重定向到文件中,否则Sort命令并不对文件内容进行实际的排序(即文件内容没有修改),只是将文件内容按有序输出。

命令选项

排序选项:

  • -b, --ignore-leading-blanks 忽略前导的空白区域

  • -d, --dictionary-order 只考虑空白区域和字母字符

  • -f, --ignore-case 忽略字母大小写

  • -g, --general-numeric-sort 按照常规数值排序

  • -i, --ignore-nonprinting 只排序可打印字符

  • -M, --month-sort 比较 (未知) < "一月" < ... < "十二月"在LC_ALL=C 时为(unknown) < JAN' < ... <DEC'

  • -h, --human-numeric-sort 使用易读性数字(例如: 2K 1G)

  • -n, --numeric-sort 根据字符串数值比较

  • -R, --random-sort 根据随机hash 排序

  • -r, --reverse 逆序输出排序结果

  • -V, --version-sort 在文本内进行自然版本排序

其他选项

  • -c, --check, --check=diagnose-first 检查输入是否已排序,若已有序则不进行操作

  • -C, --check=quiet, --check=silent 类似-c,但不报告第一个无序行

  • -k, --key=位置1[,位置2] 在位置1 开始一个key,在位置2 终止(默认为行尾)

  • -m, --merge 合并已排序的文件,不再进行排序

  • -o, --output=文件 将结果写入到文件而非标准输出

  • -s, --stable 禁用last-resort 比较以稳定比较算法

  • -S, --buffer-size=大小 指定主内存缓存大小

  • -t, --field-separator=分隔符 使用指定的分隔符代替非空格到空格的转换

  • -T, --temporary-directory=目录 使用指定目录而非$TMPDIR 或/tmp 作为临时目录,可用多个选项指定多个目录

  • -u, --unique 配合-c,严格校验排序;不配合-c,则只输出一次排序结果

  • -z, --zero-terminated 以0 字节而非新行作为行尾标志

举例

sort排序简单应用

[root@hpf-linux test]# cat phone.txt
xiaomi
huawei
apple 6
360
meizu
apple 6
[root@hpf-linux test]# sort phone.txt
360
apple 6
apple 6
huawei
meizu
xiaomi

说明:sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

去除重复的行并以正序排序输出:

[root@hpf-linux test]# sort -u phone.txt
360
apple 6
huawei
meizu
xiaomi
去除重复的行并以倒序排序输出:
[root@hpf-linux test]# sort -ur phone.txt
xiaomi
meizu
huawei
apple 6
360

我们有时候想将sort排序后的内容输出到源文件,我们可以先将排序结果输出到另外一个文件然后在覆盖到源文件,但是在sort排序中有个-o的参数就可以解决这个问题:

[root@hpf-linux test]# sort -ur phone.txt > sort.txt
[root@hpf-linux test]# cat sort.txt 
xiaomi
meizu
huawei
apple 6
360
[root@hpf-linux test]# sort sort.txt -o sort.txt 
[root@hpf-linux test]# cat sort.txt 
360
apple 6
huawei
meizu
xiaomi

由于sort默认的排序是以ASCII码进行排序的,这种排序在进行对数字大小的排序就会出现一些问题。而出现这种情况是由于排序程序将这些数字按字符来排序了,排序程序会先比较1和2,显然1小,所以就将10放在2前面喽。这也是sort的一贯作风。 我们如果想改变这种现状,就要使用-n选项,来告诉sort,“要以数值来排序”!

[root@node1 test]# cat number.txt
1
10
19
11
5
[root@node1 test]# sort number.txt 
1
10
11
19
5
[root@node1 test]# sort -n number.txt 
1
5
10
11
19

前面学习cut命令时有一个-d的选项在指定分隔符,-f选项来显示指定的区域。而sort命令也有类是的选项,即-t指定分隔符,用-k在选择排序的列,这种方式在平时经常使用:

[root@node1 test]# sort -n -t: -k 4 /etc/passwd |head -3
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
root:x:0:0:root:/root:/bin/bash

说明:在/etc/passwd文件中以:为分隔符,指定第四列进行以数值进行排序。

排序的深入学习

下面是举例的文件,第一个域是公司名称,第二个域是公司人数,第三个域是员工平均工资。

[root@node1 test]# cat company.txt
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500

我们可以按公司名称的字母进行排序:

[root@node1 test]# sort -t ' ' -k1 company.txt 
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500
也可以按公司的人数进行排序:
[root@node1 test]# sort -n  -t ' '  -k2 company.txt 
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000

说明:此处出现了问题,那就是baidu和sohu的公司人数相同,都是100人,这个时候怎么办呢?按照默认规矩,是从第一个域开始进行升序排序,因此baidu排在了sohu前面。注意-n是按数字排序。

上例中由于baidu和sohu的员工人数相同,之后sort排序就会按第一个域进行排序,若在人数相同的情况下以工资进行升序排序:

[root@node1 test]# sort -n  -t ' '  -k2 -k 3 company.txt 
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

说明:我们加了一个-k2 -k3就解决了问题。sort支持这种设定,就是说设定域排序的优先级,先以第2个域进行排序,如果相同,再以第3个域进行排序。(如果你愿意,可以一直这么写下去,设定很多个排序优先级)

若按照员工工资降序排序,如果员工人数相同的,则按照公司人数升序排序:

[root@node1 test]# sort -n -t ' ' -k 3r -k 2 company.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

说明:此处有使用了一些小技巧,在-k 3后面偷偷加上了一个小写字母r。r和-r选项的作用是一样的,就是表示逆序。因为sort默认是按照升序排序的,所以此处需要加上r表示第三个域(员工平均工资)是按照降序排序。此处你还可以加上n,就表示对这个域进行排序时,要按照数值大小进行排序,同理上例也可以通过下面方法进行排序:

[root@node1 test]# sort -t ' ' -k 3nr -k 2n company.txt 
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

说明:我们在去掉了最前面的-n选项,之后将它加入到了每一个-k选项中了。

扩展学习

-k选项的具体语法格式
要继续往下深入的话,就不得不来点理论知识。你需要了解-k选项的语法格式,如下:

[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]

这个语法格式可以被其中的逗号(“,”)分为两大部分,Start部分和End部分。 先给你灌输一个思想,那就是“如果不设定End部分,那么就认为End被设定为行尾”。这个概念很重要的,但往往你不会重视它。
Start部分也由三部分组成,其中的Modifier部分就是我们之前说过的类似n和r的选项部分。我们重点说说Start部分的FStart和C.Start。
C.Start也是可以省略的,省略的话就表示从本域的开头部分开始。之前例子中的-k 2和-k 3就是省略了C.Start的例子喽。
FStart.CStart,其中FStart就是表示使用的域,而CStart则表示在FStart域中从第几个字符开始算“排序首字符”。
在End部分中,你可以设定FEnd.CEnd,如果你省略.CEnd,则表示结尾到“域尾”,即本域的最后一个字符。或者,如果你将CEnd设定为0(零),也是表示结尾到“域尾”。

从公司英文名称的第二个字母开始进行排序:

[root@node1 test]# sort -t ' ' -k 1.2 company.txt 
baidu 100 5000
sohu 100 4500
google 110 5000
guge 50 3000

说明:我们使用了-k 1.2,这就表示对第一个域的第二个字符开始到本域的最后一个字符为止的字符串进行排序。你会发现baidu因为第二个字母是a而名列榜首。sohu和 google第二个字符都是o,但sohu的h在google的o前面,所以两者分别排在第二和第三。guge只能屈居第四了。

只针对公司英文名称的第二个字母进行排序,如果相同的按照员工工资进行降序排序:

[root@node1 test]# sort -t ' ' -k 1.2,1.2 -k 3,3nr company.txt 
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

说明:由于只对第二个字母进行排序,所以我们使用了-k 1.2,1.2的表示方式,表示我们“只”对第二个字母进行排序。(如果你问“我使用-k 1.2怎么不行?”,当然不行,因为你省略了End部分,这就意味着你将对从第二个字母起到本域最后一个字符为止的字符串进行排序)。对于员工工资进行排 序,我们也使用了-k 3,3,这是最准确的表述,表示我们“只”对本域进行排序,因为如果你省略了后面的3,就变成了我们“对第3个域开始到最后一个域位置的内容进行排序” 了。

关于-k和-u联合使用的例子:

[root@node1 test]# sort -n -k 2 company.txt 
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000
[root@node1 test]# sort -n -k 2 -u company.txt 
guge 50 3000
baidu 100 5000
google 110 5000

说明:文档还是前面的文档,然而当设定以公司员工域进行数值排序,之后加-u后,sohu一行就被删除了!原来-u只识别用-k设定的域,发现相同,就将后续相同的行都删除。下面的例子也可以看出。

[root@node1 test]# sort  -k 1 -u company.txt 
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500
[root@node1 test]# sort  -k 1.1,1.1 -u company.txt 
baidu 100 5000
google 110 5000
sohu 100 4500

[root@node1 test]# sort -n -k 2 -k 3 -u company.txt 
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

说明:这里设置了两层排序优先级的情况下,使用-u就没有删除任何行。原来-u是会权衡所有-k选项,将都相同的才会删除,只要其中有一级不同都不会轻易删除的。

最诡异的排序:

[root@node1 test]# sort -n -k 2.2,3.1 company.txt 
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000

说明:以第二个域的第二个字符开始到第三个域的第一个字符结束的部分进行排序。 第一行,会提取0 3,第二行提取00 5,第三行提取00 4,第四行提取10 5。 又因为sort认为0小于00小于000小于0000…. 因此0 3肯定是在第一个。10 5肯定是在最后一个。但为什么00 5却在00 4前面呢?
答案揭晓:原来“跨域的设定是个假象”,sort只会比较第二个域的第二个字符到第二个域的最后一个字符的部分,而不会把第三个域的开头字符纳入比较范围。当发现00和00相同时,sort就会自动比较第一个域去了。当然baidu在sohu前面了。用一个范例即可证实:

[root@node1 test]#  sort -n -k 2.2,3.1 -k 1,1r company.txt 
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html
http://linux.chinaunix.net/techdoc/system/2008/09/21/1033339.shtml

uniq

前面在用sort进行排序的时候对于重复排序域我们可以用-u进行去重,linux下也有其他命令可以去除重复行,常用还是uniq命令。使用uniq的时候要注意以下二点 :
对文本操作时,它一般会和sort命令进行组合使用,因为uniq 不会检查重复的行,除非它们是相邻的行。如果您想先对输入排序,使用sort -u。
对文本操作时,若域中为先空字符(通常包括空格以及制表符),然后非空字符,域中字符前的空字符将被跳过

命令参数

  • -c, --count 在每行前加上表示相应行目出现次数的前缀编号

  • -d, --repeated 只输出重复的行

  • -D, --all-repeated[=delimit-method 显示所有重复的行delimit-method={none(default),prepend,separate}以空行为界限

  • -f, --skip-fields=N 比较时跳过前N 列

  • -i, --ignore-case 在比较的时候不区分大小写

  • -s, --skip-chars=N 比较时跳过前N 个字符

  • -u, --unique 只显示唯一的行

  • -z, --zero-terminated 使用'\0'作为行结束符,而不是新换行

  • -w, --check-chars=N 对每行第N 个字符以后的内容不作对照

使用举例

[root@hpf-linux test]# cat uniq.txt
this is a test  
this is a test  
this is a test  
i am tank  
i love tank  
i love tank  
this is a test  
whom have a try  
WhoM have a try  
you  have a try  
i want to abroad  
those are good men  
we are good men 
[root@hpf-linux test]# uniq -c uniq.txt
      3 this is a test  
      1 i am tank  
      2 i love tank  
      1 this is a test  
      1 whom have a try  
      1 WhoM have a try  
      1 you  have a try  
      1 i want to abroad  
      1 those are good men  
      1 we are good men 

说明:从上例子中我们可以看出,uniq的一个特性,检查重复行的时候,只会检查相邻的行。然而实际中重复的数据一般都不会在一块,所以就需要用sort先进行排序后在用uniq进行去重。

[root@hpf-linux test]# sort uniq.txt |uniq -c
      1 i am tank  
      2 i love tank  
      1 i want to abroad  
      4 this is a test  
      1 those are good men  
      1 we are good men 
      1 whom have a try  
      1 WhoM have a try  
      1 you  have a try 

说明:通过sort命令的排序这样就很好的解决了上面出现的问题。
只显示重复的行并统计重复的次数:

[root@hpf-linux test]# uniq -d -c uniq.txt 
     3 this is a test  
     2 i love tank  

说明:-d只会输出一次重复的行,而想重复的行给全部显示出来可以用-D选项,注意-D不能和-c一起使用。

[root@hpf-linux test]# uniq -D  uniq.txt 
this is a test  
this is a test  
this is a test  
i love tank  
i love tank  

忽略第一列进行统计重复的行:

[root@hpf-linux test]# uniq -c -f 1 uniq.txt 
      3 this is a test  
      1 i am tank  
      2 i love tank  
      1 this is a test  
      2 whom have a try  
      1 you  have a try  
      1 i want to abroad  
      1 those are good men  
      1 we are good men

检查的时候,不区分大小写:

[root@hpf-linux test]# uniq -c -i uniq.txt 
      3 this is a test  
      1 i am tank  
      2 i love tank  
      1 this is a test  
      2 whom have a try  
      1 you  have a try  
      1 i want to abroad  
      1 those are good men  
      1 we are good men 

检查的时候,不考虑前4个字符:

[root@hpf-linux test]# uniq -c -s 4 uniq.txt 
      3 this is a test  
      1 i am tank  
      2 i love tank  
      1 this is a test  
      3 whom have a try  
      1 i want to abroad  
      1 those are good men  
      1 we are good men 

说明:由于忽略了前四个字符所以whom have a try 就和 you have a try 就一样了

去重复的项,然后全部显示出来:

[root@hpf-linux test]# uniq -u uniq.txt 
i am tank  
this is a test  
whom have a try  
WhoM have a try  
you  have a try  
i want to abroad  
those are good men  
we are good men 

对每行第2个字符以后的内容不作检查:

[root@hpf-linux test]# uniq -c -w 2 uniq.txt 
      3 this is a test  
      3 i am tank  
      1 this is a test  
      1 whom have a try  
      1 WhoM have a try  
      1 you  have a try  
      1 i want to abroad  
      1 those are good men  
      1 we are good men 

说明:由于只统计前两个字符而之后的就不在统计,所以i am tank 根 i love tank就一样了

wc

输出每个指定文件的行数、单词计数和字节数,如果指定了 多于一个文件,继续给出所有相关数据的总计。如果没有指定文件,或者文件为"-",则从标准输入读取数据。

命令参数

  • -c, --bytes 输出字节数统计

  • -m, --chars 输出字符数统计

  • -l, --lines 输出行数统计

  • -L, --max-line-length 显示最长行的长度

  • -w, --words 显示单词计数

使用举例

wc -c filename:显示一个文件的字节数
wc -m filename:显示一个文件的字符数
wc -l filename:显示一个文件的行数
wc -L filename:显示一个文件中的最长行的长度
wc -w filename:显示一个文件的字数

[root@hpf-linux test]# wc  /etc/passwd
  25   34 1111 /etc/passwd
行数 单词数 字节数 文件名 
[root@hpf-linux test]# wc -cmlwL /etc/passwd
  25   34 1111 1111   66 /etc/passwd
[root@hpf-linux test]# wc -wcmlL /etc/passwd
  25   34 1111 1111   66 /etc/passwd

说明:从上面的命令行执行结果来看,wc的输出数据的顺序与的几个参数的顺序好像没有关系?!

用wc命令怎么做到只打印统计数字不打印文件名:

[root@hpf-linux test]# wc -l /etc/passwd
25 /etc/passwd
[root@hpf-linux test]# cat /etc/passwd |wc -l
25

tr

通过使用tr,您可以非常容易地实现 sed 的许多最基本功能。您可以将 tr 看作为 sed的(极其)简化的变体:它可以用一个字符来替换另一个字符,或者可以完全除去一些字符。您也可以用它来除去重复字符。这就是所有 tr所能够做的。
tr用来从标准输入中通过替换或删除操作进行字符转换。tr主要用于删除文件中控制字符或进行字符转换。使用tr时要转换两个字符串:字符串1用于查询,字符串2用于处理各种转换。tr刚执行时,字符串1中的字符被映射到字符串2中的字符,然后转换操作开始。

用法

tr [选项]... SET1 [SET2]

从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出。

选项

  • -c, -C, --complement 首先补足SET1

  • -d, --delete 删除匹配SET1 的内容,并不作替换

  • -s, --squeeze-repeats 如果匹配于SET1 的字符在输入序列中存在连续的 重复,在替换时会被统一缩为一个字符的长度

  • -t, --truncate-set1 先将SET1 的长度截为和SET2 相等
    SET 是一组字符串,一般都可按照字面含义理解。解析序列如下:
    \NNN 八进制值为NNN 的字符(1 至3 个数位)
    \ 反斜杠
    \a 终端鸣响
    \b 退格
    \f 换页
    \n 换行
    \r 回车
    \t 水平制表符
    \v 垂直制表符
    字符1-字符2 从字符1 到字符2 的升序递增过程中经历的所有字符
    [字符*] 在SET2 中适用,指定字符会被连续复制直到吻合设置1 的长度
    [字符*次数] 对字符执行指定次数的复制,若次数以 0 开头则被视为八进制数
    [:alnum:] 所有的字母和数字
    [:alpha:] 所有的字母
    [:blank:] 所有呈水平排列的空白字符
    [:cntrl:] 所有的控制字符
    [:digit:] 所有的数字
    [:graph:] 所有的可打印字符,不包括空格
    [:lower:] 所有的小写字母
    [:print:] 所有的可打印字符,包括空格
    [:punct:] 所有的标点字符
    [:space:] 所有呈水平或垂直排列的空白字符
    [:upper:] 所有的大写字母
    [:xdigit:] 所有的十六进制数
    [=字符=] 所有和指定字符相等的字符

仅在SET1 和SET2 都给出,同时没有-d 选项的时候才会进行替换。 仅在替换时才可能用到-t 选项。如果需要SET2 将被通过在末尾添加原来的末字符的方式 补充到同SET1 等长。SET2 中多余的字符将被省略。只有[:lower:] 和[:upper:]以升序展开字符;在用于替换时的SET2 中以成对表示大小写转换。-s 作用于SET1,既不 替换也不删除,否则在替换或展开后使用SET2 缩减。

使用举例

将文件file中出现的"abc"替换为"xyz":

# cat file | tr "abc" "xyz" > new_file 

注意】这里,凡是在file中出现的"a"字母,都替换成"x"字母,"b"字母替换为"y"字母,"c"字母替换为"z"字母。而不是将字符串"abc"替换为字符串"xyz"。

使用tr命令“统一”字母大小写:
(小写 --> 大写)

# cat file | tr [a-z] [A-Z] > new_file

(大写 --> 小写)

# cat file | tr [A-Z] [a-z] > new_file

把文件中的数字0-9替换为a-j

# cat file | tr [0-9] [a-j] > new_file

删除文件file中出现的"Snail"字符

# cat file | tr -d "Snail" > new_file

【注意】这里,凡是在file文件中出现的'S','n','a','i','l'字符都会被删除!而不是紧紧删除出现的"Snail”字符串。

删除文件file中出现的换行'\n'、制表'\t'字符 :

  # cat file | tr -d "\n\t" > new_file

不可见字符都得用转义字符来表示的,这个都是统一的。

删除“连续着的”重复字母,只保留第一个

# cat file | tr -s [a-zA-Z] > new_file

删除空行 :

# cat file | tr -s "\n" > new_file

删除Windows文件“造成”的'^M'字符

# cat file | tr -d "\r" > new_file

或者

# cat file | tr -s "\r" "\n" > new_file

【注意】这里-s后面是两个参数"\r"和"\n",用后者替换前者

用空格符\040替换制表符\011

# cat file | tr -s "\011" "\040" > new_file

把路径变量中的冒号":",替换成换行符"\n"

# echo $PATH | tr -s ":" "\n"

去除oops.txt里面的重复的小写字符

# tr -s "[a-z]"<oops.txt >result.txt 

删除空行

# tr -s "[\012]" < plan.txt 或 tr -s ["\n"] < plan.txt 

删除指定字符
一个星期的日程表任务是从其中删除所有数字,只保留日期日期有大写,也有小写格式因此需指定两个字符范围[a-z]和[A-Z],命令tr -cs "[a-z][A-Z]" "[\012*]" 将文件每行所有不包含在[a-z]或[A-Z](所有希腊字母)的字符串放在字符串1中并转换为一新行-s选项表明压缩所有新行, -c表明保留所有字母不动原文件如下,后跟tr命令:

# tr -cs "[a-z][A-Z]" "[\012*]" <diary.txt 

http://blog.csdn.net/jeffreyst_zb/article/details/8047065

paste

cut用来从文本文件或标准输出中抽取数据列或者域,然后再用paste可以将这些数据粘贴起来形成相关文件。 粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同。paste将按行将不同文件行信息放在一行。缺省情况下, paste连接时,用空格或tab键分隔新行中不同文本,除非指定-d选项,它将成为域分隔符。

命令选项

  • -d, --delimiters=列表 改用指定列表里的字符替代制表分隔符

  • -s, --serial 不使用平行的行目输出模式,而是每个文件占用一行

使用举例:

这些是DOTA的英雄中文名:

[root@hpf-linux test]# cat CN_name.txt 
全能骑士
月之骑士
蝙蝠骑士

这些是DOTA的英雄简称名:

[root@hpf-linux test]# cat EN_name.txt 
OK
Luna
BAT

这些是DOTA的英雄类型:

[root@hpf-linux test]# cat type.txt 
力量
敏捷
智力

现在需要将这些名称合并到一个文件中:

[root@hpf-linux test]# paste CN_name.txt EN_name.txt type.txt 
全能骑士    OK    力量
月之骑士    Luna    敏捷
蝙蝠骑士    BAT    智力

各个字段默认是用TAB分开的,可以使用参数-d来指定自己喜欢的分隔符,如下示例:

[root@hpf-linux test]# paste -d ' ' CN_name.txt EN_name.txt type.txt 
全能骑士 OK 力量
月之骑士 Luna 敏捷
蝙蝠骑士 BAT 智力

不使用并行输出使用而将一个文件输出一行:

[root@hpf-linux test]# paste -s CN_name.txt EN_name.txt type.txt 
全能骑士    月之骑士    蝙蝠骑士
OK    Luna    BAT
力量    敏捷    智力

说明:-s参数就是输出一行一个文件,有多少个文件就有多少行。原始每个文件里的每行内容都成为输出结果一行里的各个字段。

split

将输入内容拆分为固定大小的分片并输出到"前缀aa"、"前缀ab",...; 默认以 1000 行为拆分单位,默认前缀为"x"。如果不指定文件,或 者文件为"-",则从标准输入读取数据。

命令选项

  • -a, --suffix-length=N 指定后缀长度为N (默认为2)

  • -b, --bytes=大小 指定每个输出文件的字节大小

  • -C, --line-bytes=大小 指定每个输出文件里最大行字节大小

  • -d, --numeric-suffixes 使用数字后缀代替字母后缀

  • -l, --lines=数值 指定每个输出文件有多少行

使用举例

以每个文件1000行分割:

[root@hpf-linux splittest]# split messages 
[root@hpf-linux splittest]# wc -l *
  4930 messages
  1000 xaa
  1000 xab
  1000 xac
  1000 xad
   930 xae
  9860 总用量

说明:split命令分割文件成每个文件1000行,并且文件名依次为 [前缀]aa, [前缀]ab, [前缀]ac等,默认的前缀是X,每个文件的行数为1000行,命令如下:

以每个文件100K分割:

[root@hpf-linux splittest]# split -b 100K messages 
[root@hpf-linux splittest]# ls -lh *
-rw-------. 1 root root 403K 3月  23 00:14 messages
-rw-r--r--. 1 root root 100K 3月  23 00:19 xaa
-rw-r--r--. 1 root root 100K 3月  23 00:19 xab
-rw-r--r--. 1 root root 100K 3月  23 00:19 xac
-rw-r--r--. 1 root root 100K 3月  23 00:19 xad
-rw-r--r--. 1 root root 2.3K 3月  23 00:19 xae

以每个文件100K指定前缀分割:

[root@hpf-linux splittest]# split -b 100K  messages log
[root@hpf-linux splittest]# ls -lh *
-rw-r--r--. 1 root root 100K 3月  23 00:22 logaa
-rw-r--r--. 1 root root 100K 3月  23 00:22 logab
-rw-r--r--. 1 root root 100K 3月  23 00:22 logac
-rw-r--r--. 1 root root 100K 3月  23 00:22 logad
-rw-r--r--. 1 root root 2.3K 3月  23 00:22 logae
-rw-------. 1 root root 403K 3月  23 00:14 messages

基于行数分割文件:

[root@hpf-linux splittest]# split -l 2000 messages log
[root@hpf-linux splittest]# wc -l *
  2000 logaa
  2000 logab
   930 logac
  4930 messages
  9860 总用量

以数字后缀命名分割文件:

[root@hpf-linux splittest]# split -d messages log
[root@hpf-linux splittest]# ls
log00  log01  log02  log03  log04  messages

#echo
echo命令用于在shell中打印shell变量的值,或者直接输出指定的字符串。linux的echo命令,在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的,因此有必要了解下echo的用法echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。 echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。

选项

  • -e:启用反斜线控制字符的转换

  • -E:关闭反斜线控制字符的转换(预设如此)

  • -n:取消行末之换行符号(与 -e 选项下的 \c 字符同意)

关于 echo 命令所支援反斜线控制字符如下表:

  • \a 发出警告声;

  • \b 删除前一个字符;

  • \c 最后不加上换行符号;

  • \f 换行但光标仍旧停留在原来的位置;

  • \n 换行且光标移至行首;

  • \r 光标移至行首,但不换行;

  • \t 插入tab;

  • \v 与\f相同;

  • \ 插入\字符;

  • \nnn 插入nnn(八进制)所代表的ASCII字符;

举例

通过echo 命令修改密码:

# echo -e "redhat\nredhat" |passwd user1

这么操作会让别人看到密码,我们可以使用把密码写入到文件中然后在修改,也可以通过修改history 命令历史来清除这条命令,下面介绍是把密码写入到文件中来修改密码:

# echo -e "`cat aaa`\n`cat aaa`" |passwd user1

通过echo显示文字颜色:

# echo -e "\e[1;31mThis is red text\e[0m" 

\e[1;31m 将颜色设置为红色
\e[0m 将颜色重新置回
颜色码:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37

背景色:

# echo -e "\e[1;42mGreed Background\e[0m" Greed Background 

颜色码:重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,洋红=45,青色=46,白色=47

文字闪动:

# echo -e "\033[37;31;5mMySQL Server Stop...\033[39;49;0m" 

红色数字处还有其他数字参数:0 关闭所有属性、1 设置高亮度(加粗)、4 下划线、5 闪烁、7 反显、8 消隐

seq

seq命令用于产生从某个数到另外一个数之间的所有整数。

语法

seq [选项]... 尾数 
seq [选项]... 首数 尾数 
seq [选项]... 首数 增量 尾数

选项:

  • -f, --format=格式 使用printf 样式的浮点格式

  • -s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n)

  • -w, --equal-width 在列前添加0 使得宽度相同

应用举例

指定格式:

[root@hpf-linux ~]# seq -f %3g 9 11
  9
 10
 11

%后面指定数字的位数 默认是%g,%3g那么数字位数不足部分是空格。

[root@hpf-linux ~]# seq -f"str%03g" 9 11
str009
str010
str011

这样的话数字位数不足部分是0,%前面制定字符串。

指定输出数字同宽 :

[root@hpf-linux ~]# seq -w 99 101
099
100
101

不能和-f一起用,输出是同宽的。

指定分隔符(默认是回车) :

[root@hpf-linux ~]# seq -s" " -f"str%03g" 9 11
str009 str010 str011

要指定\t做为分隔符号:

[root@hpf-linux ~]# seq -s"`echo -e "\t"`" 9 11
9    10    11

tee

tee命令用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。简单的说就是把数据重定向到给定文件和屏幕上。

 


 

 

存在缓存机制,每1024个字节将输出一次。若从管道接收输入数据,应该是缓冲区满,才将数据转存到指定的文件中。若文件内容不到1024个字节,则接收完从标准输入设备读入的数据后,将刷新一次缓冲区,并转存数据到指定文件。

语法

tee(选项)(参数)

选项

  • -a:向文件中重定向时使用追加模式;

  • -i:忽略中断(interrupt)信号。

应用举例

比如我现在要运行w:
如果只希望运行信息显示在屏幕上,那么直接运行w就可以了。
如果只希望运行信息输入到文件中,那么用重定向符 > 就可以了,如下。

[root@hpf-linux ~]# w > test.txt

如果希望把vasp程序运行信息输出到output.txt文件中,同时也能在屏幕显示这些运行信息,那么就可以用如下的命令。

[root@hpf-linux ~]# w | tee abc.txt
 18:34:11 up  6:21,  1 user,  load average: 0.04, 0.03, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/2    192.168.5.7      12:53    0.00s  0.19s  0.00s w
posted @ 2016-12-25 14:42  ProfiBus  阅读(978)  评论(0编辑  收藏  举报