LFCS #1:如何在 Linux 中使用 'sed' 命令创建、编辑和操作文件
Linux 基金会宣布了LFCS(Linux 基金会认证系统管理员)认证,这是一项新计划,旨在帮助世界各地的个人获得 Linux 系统基础到中级系统管理任务认证。
这包括支持正在运行的系统和服务,以及第一手的故障排除和分析,以及将问题上报给工程团队的智能决策。
该系列标题为LFCS(Linux 基金会认证系统管理员)的准备第 1至33部分,涵盖以下主题:
这篇文章是33 个教程系列的第 1部分,它将涵盖LFCS认证考试所需的必要领域和能力。话虽如此,启动您的终端,让我们开始吧。
在 Linux 中处理文本流
Linux 将程序的输入和输出视为字符流(或序列)。要开始理解重定向和管道,我们必须首先了解三种最重要的I/O(输入和输出)流类型,它们实际上是特殊文件(按照 UNIX 和 Linux 的惯例,数据流和外围设备或设备文件也被视为普通文件)。
>
(重定向运算符)和(管道运算符)之间的区别|
在于,前者将命令与文件连接起来,而后者将一个命令的输出与另一个命令连接起来。
# command > file # command1 | command2
由于重定向操作符会默默创建或覆盖文件,所以我们必须极其小心地使用它,并且切勿将其与管道混淆。
Linux 和 UNIX 系统上管道的一个优点是管道不需要中间文件——第一个命令的标准输出不会写入文件,然后由第二个命令读取。
对于下面的练习,我们将使用诗歌“快乐的孩子”(匿名作者)。
使用 sed 命令
sed是流编辑器(stream editor) 的缩写。对于不熟悉该术语的人来说,流编辑器用于对输入流(文件或来自管道的输入)执行基本的文本转换。
将文件中的小写字母更改为大写字母
sed最基本(也是最常用)的用法是替换字符。我们首先将出现的每个小写字母更改y
为大写字母Y
,并将输出重定向到ahappychild2.txt。
该g
标志表示 sed 应对文件每一行中的所有 term 实例执行替换。如果省略此标志,sed 将仅替换每一行中第一次出现的 term。
Sed 基本语法:
# sed ‘s/term/replacement/flag’ file
我们的例子:
# sed ‘s/y/Y/g’ ahappychild.txt > ahappychild2.txt
在文件中搜索和替换单词
如果您想要搜索或替换特殊字符(例如/
,, ) \
,&
则需要在术语或替换字符串中使用反斜杠将其转义。
例如,我们将用“and”替换“&”符号。同时,当在行首发现第一个“and”时,我们将用“ I
with”替换该词。You
# sed 's/and/\&/g;s/^I/You/g' ahappychild.txt
在上面的命令中,^
(插入符号)是一个众所周知的正则表达式,用于表示一行的开头。
如您所见,我们可以组合两个或多个替换命令(并在其中使用正则表达式),通过用分号分隔它们并将集合括在单引号内。
打印文件中选定的行
sed的另一个用途是显示(或删除)文件的选定部分。在下面的示例中,我们将显示6 月 8 日/var/log/messages的前 5 行。
# sed -n '/^Jun 8/ p' /var/log/messages | sed -n 1,5p
请注意,默认情况下,sed 会打印每一行。我们可以使用-n选项覆盖此行为,然后告诉 sed 仅打印(由p指示)文件(或管道)中与模式匹配的部分(第一种情况下是行首的 Jun 8,第二种情况下是第 1 行到第 5 行(含)。
最后,在检查脚本或配置文件时,检查代码本身并省略注释会很有用。以下 sed 单行命令删除 ( d
) 个空行或以#
(字符表示两个正则表达式之间的|
布尔或) 开头的行。
# sed '/^#\|^$/d' apache2.conf
uniq 命令
uniq 命令允许我们报告或删除文件中的重复行,默认情况下写入 stdout。我们必须注意,uniq不会检测重复的行,除非它们是相邻的。
因此,uniq通常与前面的sort(用于对文本文件的行进行排序)一起使用。默认情况下,sort将第一个字段(以空格分隔)作为关键字段。要指定不同的关键字段,我们需要使用选项-k
。
Uniq 命令示例
du -sch /path/to/directory/*命令以人类可读的格式返回指定目录内每个子目录和文件的磁盘空间使用情况(也显示每个目录的总数),并且不按大小排序输出,而是按子目录和文件名排序。
我们可以使用以下命令按大小排序。
# du -sch /var/* | sort –h
您可以通过告诉uniq使用每行(其中指定日期)的前 6 个字符进行比较(-w 6)
,并在每个输出行前面加上出现次数(-c
)作为前缀,使用以下命令来按日期计算日志中的事件数。
# cat /var/log/mail.log | uniq -c -w 6
最后,你可以组合sort和uniq(它们通常都是这样)。考虑以下文件,其中包含捐赠者列表、捐赠日期和金额。假设我们想知道有多少位独特的捐赠者。
我们将使用以下cat 命令来剪切第一个字段(字段由冒号分隔),按名称排序,并删除重复的行。
# cat sortuniq.txt | cut -d: -f1 | sort | uniq
grep 命令
grep 命令在文本文件或(命令输出)中搜索指定正则表达式的出现,并将包含匹配项的任何行输出到标准输出。
Grep 命令示例
显示用户 gacanepa 的/etc/passwd信息,忽略大小写。
# grep -i gacanepa /etc/passwd
显示/etc中名称以rc开头且后跟任意单个数字的所有内容。
# ls -l /etc | grep rc[0-9]
tr 命令用法
tr 命令可用于翻译(更改)或删除 stdin 中的字符,并将结果写入 stdout。
将 sortuniq.txt 文件中的所有小写字母更改为大写字母。
# cat sortuniq.txt | tr [:lower:] [:upper:]
将ls –l输出中的分隔符压缩为仅一个空格。
# ls -l | tr -s ' '
剪切命令用法
cut 命令提取输入行的部分内容(来自 stdin 或文件)并根据字节数(-b
option )、字符数(-c
)或字段数(-f
)在标准输出上显示结果。
在最后一种情况下(基于字段),默认字段分隔符是制表符,但可以使用选项指定不同的分隔符-d
。
剪切命令示例
从/etc/passwd中提取用户帐户及其指定的默认 shell (该–d
选项允许我们指定字段分隔符,–f
开关指示将提取哪些字段)。
# cat /etc/passwd | cut -d: -f1,7
总结一下,我们将创建一个由上一个命令输出的第一个和第三个非空白文件组成的文本流。我们将使用grep作为第一个过滤器来检查用户gacanepa的会话,然后将分隔符压缩为仅一个空格 ( tr -s ‘ ‘
)。
接下来,我们将使用cut提取第一和第三个字段,最后按显示唯一的第二个字段(在本例中为 IP 地址)进行排序。
# last | grep gacanepa | tr -s ' ' | cut -d' ' -f1,3 | sort -k2 | uniq
上述命令显示了如何组合多个命令和管道,以便根据我们的需要获取过滤后的数据。您也可以分部分运行它,以帮助您查看从一个命令流水线传输到下一个命令的输出(顺便说一句,这可能是一次很棒的学习经历!)。
概括
虽然这个例子(以及本教程中的其余例子)乍一看可能不是很有用,但它们是开始尝试使用 Linux 命令行创建、编辑和操作文件的命令的一个很好的起点。
请随意在下面留下您的问题和评论——我们将非常感激!
LFCS 电子书现已开放购买。立即订购,开始成为认证 Linux 系统管理员的旅程!
产品名称 | 价格 | 买 |
---|---|---|
Linux 基金会的 LFCS 认证准备指南 | 19.99 美元 | [立即购买] |
最后,但同样重要的一点是,请考虑使用以下链接购买您的考试券,以赚取少量佣金,这将帮助我们保持本书的更新。