LFCS 系列第一讲:如何在 Linux 上使用 GNU sed 等命令来创建、编辑和操作文件

LFCS 系列第一讲:如何在 Linux 上使用 GNU sed 等命令来创建、编辑和操作文件

Linux 基金会宣布了一个全新的 LFCS(Linux 基金会认证系统管理员Linux Foundation Certified Sysadmin)认证计划。这一计划旨在帮助遍布全世界的人们获得其在处理 Linux 系统管理任务上能力的认证。这些能力包括支持运行的系统服务,以及第一手的故障诊断、分析,以及为工程师团队在升级时提供明智的决策。

Linux 基金会认证系统管理员——第一讲

请观看下面关于 Linux 基金会认证计划的演示:

该系列将命名为《LFCS 系列第一讲》至《LFCS 系列第十讲》并覆盖关于 Ubuntu、CentOS 以及 openSUSE 的下列话题。

  • 第一讲:如何在 Linux 上使用 GNU sed 等命令来创建、编辑和操作文件
  • 第二讲:如何安装和使用 vi/m 全功能文字编辑器
  • 第三讲:归档文件/目录并在文件系统中寻找文件
  • 第四讲:为存储设备分区,格式化文件系统和配置交换分区
  • 第五讲:在 Linux 中挂载/卸载本地和网络(Samba & NFS)文件系统
  • 第六讲:组合分区作为 RAID 设备——创建&管理系统备份
  • 第七讲:管理系统启动进程和服务(使用 SysVinit, Systemd 和 Upstart)
  • 第八讲:管理用户和组,文件权限和属性以及启用账户的 sudo 权限
  • 第九讲:用 Yum,RPM,Apt,Dpkg,Aptitude,Zypper 进行 Linux 软件包管理
  • 第十讲:学习简单的 Shell 脚本编程和文件系统故障排除

重要提示:由于自 2016/2 开始 LFCS 认证要求有所变化,我们增加发布了下列必需的内容。要准备这个考试,推荐你也看看我们的 LFCE 系列。

  • 第十一讲:怎样使用 vgcreate、lvcreate 和 lvextend 命令创建和管理 LVM
  • 第十二讲:怎样安装帮助文档和工具来探索 Linux
  • 第十三讲:怎样配置和排错 GRUB

本文是覆盖这个参加 LFCS 认证考试的所必需的范围和技能的十三个教程的第一讲。话说了那么多,快打开你的终端,让我们开始吧!

处理 Linux 中的文本流

Linux 将程序中的输入和输出当成字符流或者字符序列。在开始理解重定向和管道之前,我们必须先了解三种最重要的I/O(输入和输出Input and Output)流,事实上,它们都是特殊的文件(根据 UNIX 和 Linux 中的约定,数据流和外围设备(设备文件)也被视为普通文件)。

在 > (重定向操作符) 和 | (管道操作符)之间的区别是:前者将命令与文件相连接,而后者将命令的输出和另一个命令相连接。


  1. # command > file
  2. # command1 | command2

由于重定向操作符会静默地创建或覆盖文件,我们必须特别小心谨慎地使用它,并且永远不要把它和管道混淆起来。在 Linux 和 UNIX 系统上管道的优势是:第一个命令的输出不会写入一个文件而是直接被第二个命令读取。

在下面的操作练习中,我们将会使用这首诗——《A happy child》(作者未知)

cat 命令样例

使用 sed

sed 是流编辑器stream editor的缩写。为那些不懂术语的人额外解释一下,流编辑器是用来在一个输入流(文件或者管道中的输入)执行基本的文本转换的工具。

sed 最基本的用法是字符替换。我们将通过把每个出现的小写 y 改写为大写 Y 并且将输出重定向到 ahappychild2.txt 开始。g 标志表示 sed 应该替换文件每一行中所有应当替换的实例。如果这个标志省略了,sed 将会只替换每一行中第一次出现的实例。

基本语法:


  1. # sed 's/term/replacement/flag' file

我们的样例:


  1. # sed 's/y/Y/g' ahappychild.txt > ahappychild2.txt

sed 命令样例

如果你要在替换文本中搜索或者替换特殊字符(如 /,\,&),你需要使用反斜杠对它进行转义。

例如,我们要用一个符号来替换一个文字,与此同时我们将把一行最开始出现的第一个 I 替换为 You。


  1. # sed 's/and/\&/g;s/^I/You/g' ahappychild.txt

sed 替换字符串

在上面的命令中,众所周知 ^(插入符号)是正则表达式中用来表示一行开头的符号。

正如你所看到的,我们可以通过使用分号分隔以及用括号包裹来把两个或者更多的替换命令(并在它们中使用正则表达式)连接起来。

另一种 sed 的用法是显示或者删除文件中选中的一部分。在下面的样例中,将会显示 /var/log/messages 中从6月8日开始的头五行。


  1. # sed -n '/^Jun 8/ p' /var/log/messages | sed -n 1,5p

请注意,在默认的情况下,sed 会打印每一行。我们可以使用 -n 选项来覆盖这一行为并且告诉 sed 只需要打印(用 p来表示)文件(或管道)中匹配的部分(第一个命令中指定以“Jun 8” 开头的行,第二个命令中指定一到五行)。

最后,可能有用的技巧是当检查脚本或者配置文件的时候可以保留文件本身并且删除注释。下面的单行 sed 命令删除(d)空行或者是开头为#的行(| 字符对两个正则表达式进行布尔 OR 操作)。


  1. # sed '/^#\|^$/d' apache2.conf

sed 匹配字符串

uniq 命令

uniq 命令允许我们返回或者删除文件中重复的行,默认写到标准输出。我们必须注意到,除非两个重复的行相邻,否则uniq 命令不会删除他们。因此,uniq 经常和一个前置的 sort 命令(一种用来对文本行进行排序的算法)搭配使用。默认情况下,sort 使用第一个字段(用空格分隔)作为关键字段。要指定一个不同的关键字段,我们需要使用 -k 选项。

样例

du –sch /path/to/directory/* 命令将会以人类可读的格式返回在指定目录下每一个子文件夹和文件的磁盘空间使用情况(也会显示每个目录总体的情况),而且不是按照大小输出,而是按照子文件夹和文件的名称。我们可以使用下面的命令来让它通过大小排序。


  1. # du -sch /var/* | sort -h

sort 命令样例

你可以通过使用下面的命令告诉 uniq 比较每一行的前6个字符(-w 6)(这里是指定的日期)来统计日志事件的个数,而且在每一行的开头输出出现的次数(-c)。


  1. # cat /var/log/mail.log | uniq -c -w 6

文件中的统计数字

最后,你可以组合使用 sort 和 uniq 命令(通常如此)。看看下面文件中捐助者、捐助日期和金额的列表。假设我们想知道有多少个捐助者。我们可以使用下面的命令来分隔第一字段(字段由冒号分隔),按名称排序并且删除重复的行。


  1. # cat sortuniq.txt | cut -d: -f1 | sort | uniq

寻找文件中不重复的记录

grep 命令

grep 在文件(或命令输出)中搜索指定正则表达式,并且在标准输出中输出匹配的行。

样例

显示文件 /etc/passwd 中用户 gacanepa 的信息,忽略大小写。


  1. # grep -i gacanepa /etc/passwd

grep 命令样例

显示 /etc 文件夹下所有 rc 开头并跟随任意数字的内容。


  1. # ls -l /etc | grep rc[0-9]

使用 grep 列出内容

tr 命令使用技巧

tr 命令可以用来从标准输入中转换(改变)或者删除字符,并将结果写入到标准输出中。

样例

把 sortuniq.txt 文件中所有的小写改为大写。


  1. # cat sortuniq.txt | tr [:lower:] [:upper:]

排序文件中的字符串

压缩ls –l输出中的分隔符为一个空格。


  1. # ls -l | tr -s ' '

压缩分隔符

cut 命令使用方法

cut 命令可以基于字节(-b选项)、字符(-c)或者字段(-f)提取部分输入(从标准输入或者文件中)并且将结果输出到标准输出。在最后一种情况下(基于字段),默认的字段分隔符是一个制表符,但可以由 -d 选项来指定不同的分隔符。

样例

从 /etc/passwd 中提取用户账户和他们被分配的默认 shell(-d 选项允许我们指定分界符,-f 选项指定那些字段将被提取)。


  1. # cat /etc/passwd | cut -d: -f1,7

提取用户账户

将以上命令结合起来,我们将使用 last 命令的输出中第一和第三个非空文件创建一个文本流。我们将使用 grep 作为第一过滤器来检查用户 gacanepa 的会话,然后将分隔符压缩至一个空格(tr -s ' ')。下一步,我们将使用 cut 来提取第一和第三个字段,最后使用第二个字段(本样例中,指的是IP地址)来排序之后,再用 uniq 去重。


  1. # last | grep gacanepa | tr -s ‘ ‘ | cut -d’ ‘ -f1,3 | sort -k2 | uniq

last 命令样例

上面的命令显示了如何将多个命令和管道结合起来,以便根据我们的要求得到过滤后的数据。你也可以逐步地使用它以帮助你理解输出是如何从一个命令传输到下一个命令的(顺便说一句,这是一个非常好的学习经验!)

总结

尽管这个例子(以及在当前教程中的其他实例)第一眼看上去可能不是非常有用,但是他们是体验在 Linux 命令行中创建、编辑和操作文件的一个非常好的开始。请随时留下你的问题和意见——不胜感激!

本文来自合作伙伴“Linux中国”

原文发布时间为:2013-04-02.

时间: 2024-08-03 13:30:27

LFCS 系列第一讲:如何在 Linux 上使用 GNU sed 等命令来创建、编辑和操作文件的相关文章

如何在 Linux 上使用 Gmail SMTP 服务器发送邮件通知

如何在 Linux 上使用 Gmail SMTP 服务器发送邮件通知 假定你想配置一个 Linux 应用,用于从你的服务器或桌面客户端发送邮件信息.邮件信息可能是邮件简报.状态更新(如 Cachet).监控警报(如 Monit).磁盘时间(如 RAID mdadm)等等.当你要建立自己的 邮件发送服务器 传递信息时 ,你可以替代使用一个免费的公共 SMTP 服务器,从而避免遭受维护之苦. 谷歌的 Gmail 服务就是最可靠的 免费 SMTP 服务器 之一.想要从应用中发送邮件通知,你仅需在应用中

如何在Linux上构建 RAID 10阵列

如何在Linux上构建 RAID 10阵列 RAID 10阵列(又名RAID 1+0 或先镜像后分区)通过结合RAID 0 (读写操作在多个磁盘上同时并行执行)和RAID 1(数据被完全相同地写入到两个或更多的磁盘)两者的特点实现高性能和高容错性的磁盘I/O. 这篇文章会指导你如何使用五块相同的8GB磁盘来组成一个软件RAID 10阵列.因为组成一个RAID 10阵列至少需要4块磁盘(比如,两个镜像各有一对分区组合),而且需要添加一块额外的备用磁盘以防某块主要的磁盘出错.本文也会分享一些工具,在

如何在Linux上安装Telegram Messenger应用

如何在Linux上安装Telegram Messenger应用 Telegram是和whatsapp类似的及时通讯应用.它有一个庞大的用户群,并且很多独特的特性. Telegram Messenger for Linux 这篇文章让你了解Telegram应用,以及在Linux Box上的详细安装命令. Telegram的特性 支持移动设备 有桌面版本 第三方开发者可以访问Telegram的应用程序接口(API). 支持Android, iphone/ipad, Windows Phone, We

如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器

如何在 Linux 上使用 BackupPC 来架设跨平台的备份服务器 也许你没有从我先前关于 backupninja 和 backup-manager 的两篇文章中发现,我是一个超级备"粉".当提到备份,我宁愿备份的太多而不希望备份不足,因为如果我们有需要的话,你将会感激你为重要数据生成额外的拷贝所付出的时间和精力. 在这篇文章中,我将向你介绍 BackupPC,一个跨平台的备份服务器软件,它可以通过网络为 Linux,Windows 和 MacOS 等系统上的客户端主机拉取备份.B

如何在Linux上使用Calibre创建电子书

自从亚马逊在多年前开始销售电子书,电子书已经有了质的飞跃发展并且变得越来越流行.好消息是电子书非常容易使用自由开源的工具来被创建. 在这个教程中,我会告诉你如何在 Linux 上创建一本电子书. 在 Linux 上创建一本电子书 要创建一本电子书,你可能需要两个软件:一个文本处理器(当然,我使用的是 LibreOffice)和 Calibre .Calibre 是一个非常优秀的电子书阅读器,也是一个电子书库的程序.你可以使用它来在 Linux 上打开 ePub 文件或者管理你收集的电子书.(LC

如何在 linux 上配置持续集成服务 - Drone

如何在 linux 上配置持续集成服务 - Drone 如果你对一次又一次的克隆.构建.测试和部署代码感到厌倦了,可以考虑一下持续集成.持续集成简称 CI,是一种像我们一样的频繁提交的代码库,构建.测试和部署的软件工程实践.CI 可以帮助我们快速的集成新代码到已有的代码库.如果这个过程是自动化进行的,那么就会提高开发的速度,因为这可以减少开发人员手工构建和测试的时间.Drone 是一个自由开源项目,用来提供一个非常棒的持续集成服务的环境,采用 Apache 2.0 协议发布.它已经集成近很多代码

如何在Linux上使用命令行管理密码

如何在Linux上使用命令行管理密码 在基于密码的认证在网络盛行的今天,你可能需要或者已经使用了某种密码管理工具来跟踪管理你正在使用的所有密码.有各种各样的在线或离线服务或者软件工具用于完成此类事情,而这些工具因复杂程度.用户界面或者目标环境(如企业或终端用户)的不同而各不相同.例如,有一些是为终端用户开发基于图形化的密码管理器,如KeePass(X). 对于那些不想要依赖图形化进行密码管理的用户,笔者将会讲述如何在命令行下使用 pass来管理密码,这是一个简单的用于命令行管理密码的工具. 该密

如何在linux上分享你shell命令的输出

如何在linux上分享你shell命令的输出 前段时间我发布了一篇关于shelr.tv这个网站的文章,它提供一个服务允许你从网站上直接分享你的终端记录. 现在shelr.tv这个网站似乎关闭了,然后我四处寻找是否有类似的网站,于是我发现了commands.com. 从它的主页上来看,它的服务和其他网站提供的服务是类似的,因此让我们来测试它. 步骤 1 – 在网站上注册 只需要注册一个新的 用户名/密码,或者直接使用你的github账户快速登录. 步骤 2 – 下载安装monitor程序 Moni

puppet如何在linux上部署

问题描述 puppet如何在linux上部署 我是个新的菜鸟,我也在csdn上看了好多puppet在linux上怎么部署,写的不够详细, 所以才在这上面求助. 解决方案 http://jingyan.baidu.com/article/14bd256e29fd0dbb6c261244.html 解决方案二: puppet 部署在linux部署hornetq为系统服务Linux+nodejs+mongodb 环境部署