3.2 在文件中搜索提取内容

By admin, 18 五月, 2018

1. 查看文件内容(cat、less、head、tail)

cat <filename>

如果文件很长,可以使用分页浏览命令less。在浏览过程可以使用CTRL+F往前翻页,CTRL+B往回翻页,F是forward的首字母,B是backward的首字母。按Q键退出less浏览模式。

less <filename>

进入less浏览模式之后,按“/”然后输入关键词可以搜索字符串,按小写的n搜索下一个,按大写的N搜索上一个。

也会有人习惯把less和cat用管道操作串起来来用,效果是一样的:

cat <filename> | less

在过去有个more命令(Windows命令行也有这个命令),和less类似,但过去的more命令不能往回翻页,而现在一些系统直接就把more使用less的版本。

有时候,我们只希望查看文件的前几行或者最后几行,那么可以用head或tail命令,其中参数-n指定行数,不指定的话默认显示10行。例如:

 

head <filename>

tail -n 20 <filename>

tail命令有一个常用的参数-f,可以一直跟踪文件的最新输出。例如,我们可以用它来查看log文件,实时看最新的log。

2. 查找文件内容(grep)

grep是Linux命令行下常用于查找过滤文本文件内容的命令。最简单的用法是:

grep apple fruitlist.txt

如果想忽略大小写,可以用-i参数:

grep -i apple fruitlist.txt

如果想搜索目录里所有文件,包括子目录的话,并且在结果中显示行号,可以用以下命令:

grep -nr apple *

grep的语法支持正则表达式,正则表达式有些复杂,以后再讲解。下面是一些有用的参数:
-A num, --after-context=num: 在结果中同时输出匹配行之后的num行
-B num, --before-context=num: 在结果中同时输出匹配行之前的num行,有时候我们需要显示几行上下文。
-i, --ignore-case: 忽略大小写
-n, --line-number: 显示行号
-R, -r, --recursive: 递归搜索子目录
-v, --invert-match: 输出没有匹配的行
我们可以通过管道操作来让grep变得更强大,管道操作就是把前面一条命令的输出作为后面一条命令的输入,从而把很多简单的命令组合起来完成复杂的功能。例如,如果我们想查找包含apple的行,但又想过滤掉pineapple,可以用下面的命令:

grep apple fruitlist.txt | grep -v pineapple

如果我们想把搜索结果保存起来,那么可以把命令的标准输出重定向到文件:

grep apple fruitlist.txt | grep -v pineapple > apples.txt

重定向符号>和管道操作符号|的区别是,重定向后面接的是一个文件,它后面不能再接任何文件或命令了;而管道操作后面接的是命令,可以无限地接下去。如果想以追加方式写到文件,可以用>>。

3. 正则表达式基础

grep还支持正则表达式查找,通过参数-E完成,也可以直接运行egrep。语法如下:

  • *: 匹配0个或多个字符。例如Myfile*可匹配Myfile, Myfile1, Myfile23, Myfiles等
  • ?: 匹配0个或1个字符。例如Fou?r可以匹配For或Four
  • .: 匹配单个字符。例如Myfile.可匹配Myfile1, Myfile2,但不能匹配Myfile23
  • ^: 匹配行首。例如^server只匹配以server开头的行。
  • $: 匹配行末。例如server$只匹配以server结尾的行。
  • |: 或。例如Server|server可以匹配包含Server或server的行
  • [abc]: 匹配中括号内其中一个字符。例如[xyz]可匹配x、y或z
  • [^abc]: 匹配不是中括号内的一个字符。例如[^aei]可匹配除a、e、i之外的字符
  • [a-z0-9]: -号用于匹配字符范围。例如[1-5]可以匹配1、2、3、4、5

需要注意的是,正则表达式是有很多个版本的,在不同的语言、Shell和命令,甚至同一个命令里的不同正则表达式参数都有不同的语法,实际使用的时候要多加注意,随便抄一条正则表达式过来可能是不能达到预期效果的。

4. 管道操作

在Windows、Mac、Linux命令中存在一个很重要的管道操作概念。命令通知会有标准输入(stdin)、标准输出(stdout)和标准错误(stderr)3个管道。管道可以让不同的命令的输入和输出连接起来。管道操作是Linux命令行的一种哲学,它是计算机技术中少有的能沿用几十年的技术之一。通过管道操作,一行命令可以完成上千行程序也不能完成的文本处理功能。

在bash中,1表示标准输出,2表示标准错误,可以把这2个管道重定向到文件。例如:

ps 1>myprocess

有时候,我们希望把标准错误和标准输出一并输出到同一个文件,而不是分开两个文件重定向,就好像在屏幕看到的内容一样。那么可以把标准错误重定向到标准输出。例如:

command 1>filename 2>&1

要注意的是,上面的语法适用于bash,但不是每一种shell都适用,不同的shell对于管道重定向的语法是有差别的。

如果我们把命令的标准输出重定向到文件的同时,还希望在屏幕上看到输出,可以使用tee命令,例如:

ps | tee myprocess

5. 从文本中提取字段(cut)

以下是一些实例:

例如有一个test1.txt文件

[root@root ~]# cat test.txt

01;tom;69

02;jack;71

03;alex;68

 

;为分隔符,选取第2个字段

[root@root ~]# cut -d';' -f2 test1.txt

tom

jack

alex

 

;为分隔符,选取第1个和第3个字段

[root@root ~]# cut -d';' -f1,3 test.txt

01;69

02;71

03;68

 

打印前5个字符

[root@root ~]# cut -c-5 test.txt

01;to

02;ja

03;al

 

打印第3个至第6个字符和第9个字符

[root@iZ2ks3looonupnZ ~]# cut -c3-6,9 test1.txt

;tom9

;jac7

;ale6

 

6. 统计文本行数、单词、字节数(wc)

例如有一个test3.txt文件

[root@root ~]# cat test3.txt

  We're the leading open-source CMS for ambitious digital experiences that reach your audience across multiple channels.

  Because we all have different needs, Drupal allows you to create a unique space in a world of cookie-cutter solutions.

 

统计test1.txt字节数

[root@root ~]# wc -c test3.txt

242 test3.txt

 

统计test3.txt行数

[root@root ~]# wc -l test3.txt

2 test3.txt

统计test1.txt字数

[root@root ~]# wc -w test3.txt

36 test3.txt

我们还可以把命令配合管道操作一起用,例如下面命令可以计算目录下有多少个文件:

find . -name "*" | wc -l

 

7. 排序(sort)

sort命令可以把文本排序,-k参数是按某一列来排序。

~$ ps
  PID TTY           TIME CMD
 1959 ttys000    0:00.02 -bash
 1981 ttys001    0:00.28 -bash
 1997 ttys002    0:00.03 -bash
60762 ttys002    0:00.02 autossh -M 20000 -N root@47.91.128.213 -v -D 7070 -C
60770 ttys002    0:03.47 /usr/bin/ssh -L 20000:127.0.0.1:20000 -R 20000:127.0.0.1:20001 -N root@47.91.128.213 -v -D 7070 -C
 2038 ttys003    0:00.06 -bash
 2183 ttys004    0:00.18 -bash
 2236 ttys005    0:00.10 -bash


~$ ps|sort
  PID TTY           TIME CMD
 1959 ttys000    0:00.02 -bash
 1981 ttys001    0:00.28 -bash
 1997 ttys002    0:00.03 -bash
 2038 ttys003    0:00.06 -bash
 2183 ttys004    0:00.18 -bash
 2236 ttys005    0:00.10 -bash
60762 ttys002    0:00.02 autossh -M 20000 -N root@47.91.128.213 -v -D 7070 -C
60770 ttys002    0:03.47 /usr/bin/ssh -L 20000:127.0.0.1:20000 -R 20000:127.0.0.1:20001 -N root@47.91.128.213 -v -D 7070 -C
63398 ttys005    0:00.00 sort


~$ ps|sort -k3
  PID TTY           TIME CMD
63418 ttys005    0:00.00 sort -k3
 1959 ttys000    0:00.02 -bash
60762 ttys002    0:00.02 autossh -M 20000 -N root@47.91.128.213 -v -D 7070 -C
 1997 ttys002    0:00.03 -bash
 2038 ttys003    0:00.06 -bash
 2236 ttys005    0:00.10 -bash
 2183 ttys004    0:00.18 -bash
 1981 ttys001    0:00.28 -bash
60770 ttys002    0:03.47 /usr/bin/ssh -L 20000:127.0.0.1:20000 -R 20000:127.0.0.1:20001 -N root@47.91.128.213 -v -D 7070 -C

8. 考纲描述

3.2 Searching and Extracting Data from Files

Weight: 3

Description: Search and extract data from files in the home directory.

Key Knowledge Areas:

  • Command line pipes
  • I/O re-direction
  • Basic Regular Expressions ., [  ], *, ?

Terms and Utilities:

  • grep
  • less
  • cat, head, tail
  • sort
  • cut
  • wc

 

下一节:编写脚本

返回目录

评论

Restricted HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id> <img src>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。
验证码
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
请输入"Drupal10"