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
评论