Linux的命令行中一些文本操作技巧的实例分享
翻译领域不乏让人摸不着头脑的词汇,比如“句柄”、“套接字”、“鲁棒性”。当然,“正则表达式”也属于这一类词汇。我刚接触正则表达式的时候,对这个名词感到非常迷惑。深入了解之后,才突然明白,原来所谓的 regular expression, 其实就是“有规律、有模式的字符串”而已。
很少有一门技术,只需要投入少量的学习成本即可获得巨大的价值回报。正则表达式就属于这一类技术。可惜很多人被它密码般的语法形式当头棒喝,甚至连门都不得而入。
为什么你应该学习正则表达式?其一,在实践中应用这门技术其实不难,只需理解为数不多的几个元字符以及并不复杂的语法,就能够获得强大的文本操控能力;其二,正则表达式往往能提供处理文本的最简单最高效的解决方法(有时也许是唯一的解法)。遇上复杂的情况,如果你不会正则表达式,就只好束手无策、黯然神伤了。
正则表达式入门容易,精通却难。本文并不打算挑战此项任务^^
文本检索
grep 命令可以完成简单的文本搜索任务。
先来准备一份文本材料,把 grep 的帮助页保存为文本文件:
代码如下:
man grep | col -b grephelp.txt
下面,我想检索 grephelp.txt 文件中所有包含 "find" 这个单词的文本行:
代码如下:
grep "find" grephelp.txt
To find all occurrences of the word `patricia' in a file:
To find all occurrences of the pattern `.Pp' at the beginning of a line:
To find all lines in a file which do not contain the words `foo' or
我希望匹配到的文本使用不同的颜色显示,可以添加 --color 选项,默认的颜色是红色。
代码如下:
grep --color "find" grephelp.txt
我希望在匹配结果中显示文件名和行号,使用 -H 选项可以显示文件名,使用 -n 选项可以显示行号:
代码如下:
grep -H -n --color "find" grephelp.txt
grephelp.txt:252: To find all occurrences of the word `patricia' in a file:
grephelp.txt:256: To find all occurrences of the pattern `.Pp' at the beginning of a line:
grephelp.txt:265: To find all lines in a file which do not contain the words `foo' or
很多时候,我们需要知道匹配行前后的上下文。-A 和 -B 这两个选项会是你的好朋友。-A n 表示显示匹配行以及其后的 n 行;-B n 表示显示匹配行以及之前的 n 行。现在,我们在匹配行的前后分别额外显示两行:
代码如下:
grep -A 2 -B 2 -H -n --color "find" grephelp.txt
grephelp.txt-250-
grephelp.txt-251-EXAMPLES
grephelp.txt:252: To find all occurrences of the word `patricia' in a file:
grephelp.txt-253-
grephelp.txt-254- $ grep 'patricia' myfile
--
--
grephelp.txt-254- $ grep 'patricia' myfile
grephelp.txt-255-
grephelp.txt:256: To find all occurrences of the pattern `.Pp' at the beginning of a line:
grephelp.txt-257-
grephelp.txt-258- $ grep '^.Pp' myfile
--
--
grephelp.txt-263- match any character.
grephelp.txt-264-
grephelp.txt:265: To find all lines in a file which do not contain the words `foo' or
grephelp.txt-266- `bar':
grephelp.txt-267-
如果需要查找所有不包含 "find" 的文本行,该怎么做呢?很简单,使用 -v 选项即可。
grep 还有两个变体,egrep 和 fgrep。相对于仅支持基本正则模式(BREs)的 grep 来说,egrep 支持扩展正则模式(EREs),因而检索能力更为强大;fgrep 是所有三个工具中速度最快的一个,因为它完全不支持正则模式。
文本替换
tr 命令可以完成简单的字符转换任务。例如,可以通过 tr 把 grephelp.txt 文件转换为全文大写:
代码如下:
cat grephelp.txt | tr '[:lower:]' '[:upper:]'
简而言之,tr 的工作就是把第一个集合中的字符转换为第二个集合中的相应的字符。常用的字符集合有下面这些:
[:alnum:]:字母数字
[:alpha:]:字母
[:cntrl:] :控制字符
[:digit:]:数字
[:graph:]: 图形字符
[:lower:]:小写字母
[:print:]:可打印字符
[:punct:]:标点符号
[:space:]:空白字符
[:upper:]:大写字母
[:xdigit:]:十六进制数字
tr 命令的应用场景非常受限,如果希望进行更加灵活的模式替换,我们还有 sed(也就是 stream editor,流编辑器)。
把文件中所有的 "find" 文本替换为 "search":
代码如下:
sed "s/find/search/g" grephelp.txt
这条命令中,s 表示执行“替换操作”,/find/search/ 表示把 "find" 替换为 "search",g 表示对一行中所有的匹配进行替换。sed 默认把处理结果打印到标准输出,我们可以通过重定向把处理结果转储到一个新文件中,或者使用选项 -i 把结果直接写回原文件(有风险,需谨慎):
代码如下:
sed -i "s/find/search/g" grephelp.txt
把文件中所有的数字 n 替换为 "--n--" 的形式:
代码如下:
sed -E "s/([0-9]+)/--1--/g" grephelp.txt
选项 -E 表示在处理过程中使用扩展的正则模式(EREs),替换命令中的 1 表示引用正则表达式的第一个捕获分组。请注意,-E 这个选项只在 Mac OS X 系统和 FreeBSD 系统上有效,其他 Unix 系统需要使用另一个等效的选项 -r。
sed 的功能远不止这一些,篇幅所限,不可能详细讲解 sed 的用法。如果希望学习更多,请移步这篇文章。
文本去重
代码如下:
cat -n sonnet116.txt
1 Let me not to the marriage of true minds
2 Admit impediments. Love is not love
3 Which alters when it alteration finds,
4 Or bends with the remover to remove:
5 O, no! it is an ever-fix`ed mark,
6 O, no! it is an ever-fix`ed mark,
7 That looks on tempests and is never shaken;
8 It is the star to every wand'ring bark,
9 Whose worth's unknown, although his heighth be taken.
10 Love's not Time's fool, though rosy lips and cheeks
11 Love's not Time's fool, though rosy lips and cheeks
12 Love's not Time's fool, though rosy lips and cheeks
13 Within his bending sickle's compass come;
14 Love alters not with his brief hours and weeks,
15 But bears it out even to the edge of doom:
16 If this be error and upon me proved,
17 I never writ, nor no man ever loved.
这是莎士比亚的一首十四行诗,只可惜第5行和第10行有重复(而且第10行重复了3次)。怎么查看文本中重复的行呢?uniq 命令可以帮助你。
代码如下:
uniq -d sonnet116.txt
O, no! it is an ever-fix`ed mark,
Love's not Time's fool, though rosy lips and cheeks
选项 -d 表示仅输出重复的行。如果需要去重,使用不带选项的 uniq 命令就可以了:
代码如下:
uniq sonnet116.txt
Let me not to the marriage of true minds
Admit impediments. Love is not love
Which alters when it alteration finds,
Or bends with the remover to remove:
O, no! it is an ever-fix`ed mark,
That looks on tempests and is never shaken;
It is the star to every wand'ring bark,
Whose worth's unknown, although his heighth be taken.
Love's not Time's fool, though rosy lips and cheeks
Within his bending sickle's compass come;
Love alters not with his brief hours and weeks,
But bears it out even to the edge of doom:
If this be error and upon me proved,
I never writ, nor no man ever loved.
想要查看每一行究竟重复了多少次?没问题,使用选项 -c:
代码如下:
uniq -c sonnet116.txt
1 Let me not to the marriage of true minds
1 Admit impediments. Love is not love
1 Which alters when it alteration finds,
1 Or bends with the remover to remove:
2 O, no! it is an ever-fix`ed mark,
1 That looks on tempests and is never shaken;
1 It is the star to every wand'ring bark,
1 Whose worth's unknown, although his heighth be taken.
3 Love's not Time's fool, though rosy lips and cheeks
1 Within his bending sickle's compass come;
1 Love alters not with his brief hours and weeks,
1 But bears it out even to the edge of doom:
1 If this be error and upon me proved,
1 I never writ, nor no man ever loved.
文本排序
假设有这样一个报表文件,第一列是月份,第二列是当月的销售个数:
代码如下:
cat report.txt
March,19
June,50
February,17
May,18
August,16
April,31
May,18
July,26
January,24
August,16
这个文件的内容不仅顺序是乱的,而且还有重复。我希望按字母表顺序排序,可以下面这个命令:
代码如下:
sort report.txt
April,31
August,16
August,16
February,17
January,24
July,26
June,50
March,19
May,18
May,18
选项 -u (表示 unique)可以在排序结果中去除重复行:
代码如下:
sort -u report.txt
April,31
August,16
February,17
January,24
July,26
June,50
March,19
May,18
能不能按照月份排序呢?选项 -M (表示 month-sort)可以帮助我们:
代码如下:
sort -u -M report.txt
January,24
February,17
March,19
April,31
May,18
June,50
July,26
August,16
按照第二列的数字进行排序也是很简单的:
代码如下:
sort -u -t',' -k2 report.txt
August,16
February,17
May,18
March,19
January,24
July,26
April,31
June,50
上面的例子中,选项 -t',' 表示以逗号为分隔符对文本进行列分割;-k2 表示对第2列进行排序。
当然了,把结果逆序排列也并非不可能:
代码如下:
sort -u -r -t',' -k2 report.txt
June,50
April,31
July,26
January,24
March,19
May,18
February,17
August,16
文本统计
wc 命令用来完成文本统计工作,通过使用不同的选项,它可以统计文件中的字节数(-c),字符数(-m),单词数(-w)与行数(-l)。
例如,查看 grephelp.txt 这个文件总共有多少个单词:
代码如下:
wc -w grephelp.txt
1571 grephelp.txt
查看 sonnet116.txt 这个文件总共有多少不重复的行(废话,十四行诗当然是有14行):
代码如下:
uniq sonnet116.tx6 | wc -l
14
你还应该试试 Awk 与 Perl
如果上面介绍的工具仍然不能满足你,也许你需要火力更强的武器。试试 Awk 与 Perl 吧。
Awk 也是一款上古神器,它的年龄可能和 sed 不相上下。Awk 可谓是专门为了文本处理而生,它的语法和特性非常适合用于操纵文本和生成报表。如需学习,请参考 这篇文章,你会喜欢上它的。
长久以来,Perl 背负了“只写语言”的恶名。实际上,只要处理得当,用 Perl 一样可以写出模块清晰的、容易阅读和理解的代码。根据我的经验,使用 Perl 的场合 80% 以上与文本处理有关。Perl 内置的正则表达式支持可能是所有语言中最好的,再加上简洁紧凑的语法以及便利的操作符,这些特性帮助 Perl 成了文本处理领域当仁不让的霸主。
linux中$是什么意思?
在Linux中是一个特殊符号,通常称为“美元符号”,表示一个变量的引用。当我们在使用Linux中的命令行界面时,可以在命令行中输入$符号加上变量名或变量值,在当前环境下进行变量的引用和替换。例如,我们可以使用echo $PATH命令来输出当前系统中的PATH环境变量值。在Linux中,$符号的使用十分广泛,能够...
linux桌面命令行切换linux桌面命令行
要打开只能先用快捷键打开终端,在使用命令。具体操作方法如下:1.首先打开linux操作系统在进入到桌面 2.通常打开终端的快捷键是Ctrl+Alt+T,也可以自己设置,在右击桌面打开终端。3.然后就可以使用命令了。Linux中进入命令行界面有哪些方式?Linux操作系统有6种运行级别,分别为:0:停机,机器关闭(千万...
linux下怎么回到命令行?
2、如果在命令行下使用gedit, 关闭程序窗口(一般先保存文件),就自动退到命令行界面。如果在命令行下使用vim,先按下ESC退出编辑模式,然后输入:wq 保存并退出或者q退出或者q!强制退出,从而回到命令行界面。3、如果是其他的状态可以尝试Ctrl+Alt+F1~F6。关于Linux:Linux是一套免费使用和自由传播的...
linux中的$是什么意思?
在 Linux 中还有一个非常重要的作用,那就是表示命令行提示符。在 Linux 命令行界面中,当您登录时会显示一个提示符。这个提示符通常表示当前您所处的目录和您的用户名,它可以帮助您更好地理解当前环境。使用 $,我们可以获取到提示符中的一些信息,例如通过 $PWD 来获取当前所在的目录的绝对路径。...
linux查看系统编码格式命令linux查看系统编码
linux有查看支持那些编码的命令吗?1、连接上相应的linux主机,进入到等待输入shell指令的linux命令行状态下。2、其次,在linux命令行中输入:echo$LANG。3、最后,按下回车键执行shell指令,此时会看到该linux的汉字编码是utf-8。linux怎么看文本的编码格式?linux下经常遇到的编码问题如果你需要在linux中...
linux常用命令
3、wc wc用于统计文本中行数、字数、字符数,Linux中的wc命令是“word count”(词数统计)的缩写,用于统计文件中的行数、字数和字节数。它是一个简单而实用的命令行工具。Linux的系统介绍:Linux,全称GNU\/Linux,是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX的多用户、多任务、支持...
Linux终止前台进程的命令
1、首先,连接相应linux主机,进入到linux命令行状态下,等待输入shell指令。2、其次,以终止进程号1984的nginx子进程为例,在linux命令行中输入:kill -9 1984。3、最后,按下回车键执行shell指令,此时会看到进程号1984的nginx子进程被成功终止了。
linux 如何在命令行中进入文件夹?
linux在命令行中进入文件夹采用命令cd (Change Directory)在转入某些文件夹时,当该文件夹名称中带有空格时,应该用双引号将文件夹名称括起来,不然系统会将其当成多个cd的参数而报错。简单方法为:按Tab键自动补全(linux 和 windows系统都支持这个功能 )也可以自己人工主动加上引号,如:cd "a b c...
linux命令 $- 是什么意思
在 Linux 系统中, $ 符号表示当前用户的命令行提示符。它通常出现在命令的开头,表示这是一条需要在命令行中运行的命令。如果你在命令行中看到 $- 意味着这是一条终端命令,且$ 是特殊字符,表示当前用户。而- 是参数,具体取决于后面的命令。例如: $ ls -al 这里ls是命令, -al 是参数,代表...
linux怎么退出命令行模式linux怎么退出命令
linux命令行,如何退出某条命令。如何重新执行另一命令?ctrl+z挂起当前进程如果需要恢复到前台输入fg,恢复到后台输入bgctrl+c,彻底终止该进程如果下次碰到这样的command就这么执行,永久性放入后台nohup$command linux如何退出终端界面到主页面?linux退出命令操作界面的具体步骤如下:1、首先要按键盘左上角...
毋紫阿乐: 新建文件:1.新建文件夹命令:mkdir 文件夹名称2.创建文档就用:vi 文件名,然后就可以编辑文档了,退出的时候依次按ESC -> : ->x 就退出并保存了,:wq 保存后退出.:x 同“ wq”.:q! – 不保存内容, 强制退出.删除文件:1.删除文件夹:...
齐齐哈尔市15355547230: 在linux 4.0中对文本操作都有哪些基本命令??
毋紫阿乐: 常用的文本编辑命令,有详解.有例程 http://www.lx138.com/page_s.php?type=%E6%96%87%E6%9C%AC%E7%BC%96%E8%BE%91
齐齐哈尔市15355547230: linux中怎么用命令打开文本文件? - ?
毋紫阿乐: 通过命令+文件名查看内容.如下命令可以查看. 1, cat :由第一行开始显示文件内容; 2,tac:从最后一行开始显示,可以看出tac与cat字母顺序相反; 3,nl:显示的时候输出行号; 4,more:一页一页的显示文件内容; 5,less与more类似,但它可以向前翻页; 6,head:只看前几行; 7,tail:只看最后几行; 8,od:以二进制的方式读取文件. 9,vi和vim作为编辑器,也可以打开文件查看内容.
齐齐哈尔市15355547230: LINUX命令模式下的文本删除操作 - ?
毋紫阿乐: 目录删除:rmdir +目录名字 着个命令只能删除空目录 :rm -r +目录名字 可以删除不是空的目录,如果里面有多个目录需要一个一个询问你是否要删除. :rm -rf +目录名字 不询问直接删除 删除文件 :rm + 文件名字 自己做一下实验把,就明白了
齐齐哈尔市15355547230: linux命令vi文本编辑器的使用方法 - ?
毋紫阿乐: 如果你想编辑某个文档 可以直接编辑的如你有文档AA 可以用vi AA 【注意:必须在AA所在的目录下】 如果没有文档而且你又想编辑就可以直接编辑vi aa【名字你可以随便命名】 也可以先建立一个文档touch aa 然后再编辑vi aa 编辑器有三种模...
齐齐哈尔市15355547230: linux命令sed与awk是干什么用的,怎么用? - ?
毋紫阿乐: 非常强大的文本操纵工具,sed,awk,grep 这个三个命令 都是操作文本文件的 unix系统有几个非常命令的特点: 1. 对于内核而言,unix文件都是字节序列.io设备也是文件. 2. 至于文件的含义交由应用程序来解释.其中文本文件非常重要,因为...
齐齐哈尔市15355547230: Linux下,编辑文件的命令是什么? - ?
毋紫阿乐: vi rac01.vmx 然后按i 修改好后按esc回到命令模式 :x保存退出
齐齐哈尔市15355547230: linux命令模式下怎么把一个文本中的一行复制到另一个文本中??
毋紫阿乐: 纯粹的命令行的话 可以用下面的命令实现 假设要把文本A的第m行复制到文本B echo `sed 'mq;d' A` >> B 就把这一行添加到了文本B的最后 然后操作文本b即可 更常用的 直接在vi里面进行操作 首先打开文本A 选中要复制的行 再命令模式下 按yy 复制该行 然后按冒号输入命令 e B 进入文本B的编辑 此时移动到想要插入的行 按p就复制成功
齐齐哈尔市15355547230: linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示 - ?
毋紫阿乐: 文件管理:vi/touch/cp/mkdir/rm vi:对linux下的文本文件进行编辑 vi a 这个命令可以创建一个名字为a的文件,并可以对它进行编辑. touch:可以改变文件的时间戳或者创建新的文件 touch a 如果当前目录下没有a这个文件,则创建a文件;如果...
齐齐哈尔市15355547230: linux,unix常用基本命令?
毋紫阿乐: 1. tar 压缩文件夹 tar zcvf archive_name.tar dirname/1 解压文件夹 tar xvf archive_name.tar1 grep 在文件中查找字符串 不区分大小写 grep -i "the" demo_file1 输出成功匹配的行,以及该行之后的三行 grep -A 3 -i "example" demo_text1 在一个...