Mahesh1b 发布的文章

Linux 发行版十分好用,而且它们有一些用户可能不知道的技巧。让我们来看看一些命令行实用工具,当你热衷于终端而不是 GUI 时,它们可能更顺手。

我们都知道在一个系统上使用终端会更高效。当你编辑和排版一个文本文件时,终端会让你确切的感受到,生活如此简单。

本文将向你介绍 wcsorttrsed 命令。

wc

wc 是一个实用工具,全称是 “word count”。顾名思义,它可以用来统计任何文件的行数、单词数和字节数。

让我们来看看它是如何工作的:

$ wc filename
lines words characters filename

输出的是文件的行数、单词数、字符数和文件名。

想获得特定的输出,我们必须使用选项:

  • -c 打印字节总数
  • -l 打印行数
  • -w 打印单词总数
  • -m 打印字符总数

wc 示例

让我们来看看它的运行结果。

让我们从一个文本文件 lormipsm.txt 开始。首先,我们通过 cat 查看文件内容,然后使用 wc

$ cat loremipsm.txt
Linux is the best-known and most-used open source operating system.
As an operating system, Linux is software that sits underneath all of the other software on a computer,
receiving requests from those programs and replaying these requests to the computer's hardware.

$ wc loremipsm.txt
3 41 268 loremipsm.txt

假设我只想查看文件的字节数:

$ wc -c loremipsm.txt
268 loremipsm.txt

查看文件的行数:

$ wc -l loremipsm.txt
3 loremipsm.txt

查看文件的单词数:

$ wc -w loremipsm.txt
41 loremipsm.txt

现在只查看文件的字符数:

$ wc -m loremipsm.txt
268 loremipsm.txt

sort

sort 命令是最有用的工具之一。它会对文件的数据进行排序。可以根据字符或数字进行升序或降序排列。它也可以用来对文件中的行进行排序和随机化。

使用 sort 非常简单。我们需要做的仅仅是提供一个文件名:

$ sort filename

默认的是按照字母顺序对数据进行排序。需要注意的是 sort 命令仅仅是对数据进行排序展示。它并不会改写文件。

使用 sort 命令的一些有用的选项:

  • -r 将文件中的行按倒序进行排序
  • -R 将文件中的行打乱为随机顺序
  • -o 将输出保存到另一个文件中
  • -k 按照特定列进行排序
  • -t 使用指定的分隔符,而不使用空格
  • -n 根据数值对数据进行排序

sort 示例

让我们看看 sort 的几个简单示例。

我们有一个 list.txt 的文件,包含逗号分隔的名称和数值。

首先让我们打印出文件内容并简单排序:

$ cat list.txt
Cieran Wilks, 9
Adelina Rowland, 4
Hayden Mcfarlnd, 1
Ananya Lamb, 5
Shyam Head, 2
Lauryn Fuents, 8
Kristian Felix, 10
Ruden Dyer, 3
Greyson Meyers, 6
Luther Cooke, 7

$ sort list.txt
Adelina Rowland, 4
Ananya Lamb, 5
Cieran Wilks, 9
Greyson Meyers, 6
Hayden Mcfarlnd, 1
Kristian Felix, 10
Lauryn Fuents, 8
Luther Cooke, 7
Ruden Dyer, 3
Shyam Head, 2

现在对数据进行倒序排序:

$ sort -r list.txt
Shyam Head, 2
Ruden Dyer, 3
Luther Cooke, 7
Lauryn Fuents, 8
Kristian Felix, 10
Hayden Mcfarlnd, 1
Greyson Meyers, 6
Cieran Wilks, 9
Ananya Lamb, 5
Adelina Rowland, 4

让我们打乱数据:

$ sort -R list.txt
Cieran Wilks, 9
Greyson Meyers, 6
Adelina Rowland, 4
Kristian Felix, 10
Luther Cooke, 7
Ruden Dyer, 3
Lauryn Fuents, 8
Hayden Mcfarlnd, 1
Ananya Lamb, 5
Shyam Head, 2

来看一点更复杂的。这次我们根据第二个字段,也就是数值对数据进行排序,并使用 -o 选项将输出保存到另一个文件中:

$ sort -n -k2 -t ',' -o sorted_list.txt list.txt
$ ls
   sorted_list.txt    list.txt
$ cat sorted_list.txt
Hayden Mcfarlnd, 1
Shyam Head, 2
Ruden Dyer, 3
Adelina Rowland, 4
Ananya Lamb, 5
Greyson Meyers, 6
Luther Cooke, 7
Lauryn Fuents, 8
Cieran Wilks, 9
Kristian Felix, 10

这里我们使用 -n 选项按数字顺序进行排序,-k 选项用来指定要排序的字段(在本例中为第 2 个字段),-t 选项指定分隔符或字段分隔符(逗号),-o 选项将输出保存到 sorted_list.txt 文件中。

sed

sed 是一个流编辑器,用于过滤和转换输出中的文本。这意味着我们不需要对原文件进行修改,只需要对输出进行修改。如果需要,我们可以将更改保存到一个新的文件中。sed 提供了很多有用的选项用于过滤和编辑数据。

sed 的语法格式如下:

$ sed [OPTION] ‘PATTERN’ filename

sed 常用的一些选项:

  • -n 取消默认输出
  • p 打印指定的数据
  • d 删除指定行
  • q 退出 sed 脚本

sed 示例

我们来看看 sed 是如何运作的。我们从 data 文件开始,其中的字段表示编号、名称、年龄和操作系统。

如果行出现在特定的行范围内,该行将打印 2 次:

$ cat data
1    Vicky Grant      20   linux
2    Nora Burton    19   Mac
3    Willis Castillo   21  Windows
4    Gilberto Mack 30   Windows
5    Aubrey Hayes  17   windows
6    Allan Snyder    21   mac
7    Freddie Dean   25   linux
8    Ralph Martin    19   linux
9    Mindy Howard  20   Mac

$ sed '3,7 p' data
1    Vicky Grant      20   linux
2    Nora Burton    19   Mac
3    Willis Castillo   21  Windows
3    Willis Castillo   21  Windows
4    Gilberto Mack 30   Windows
4    Gilberto Mack 30   Windows
5    Aubrey Hayes  17   windows
5    Aubrey Hayes  17   windows
6    Allan Snyder    21   mac
6    Allan Snyder    21   mac
7    Freddie Dean   25   linux
7    Freddie Dean   25   linux
8    Ralph Martin    19   linux
9    Mindy Howard 20   Mac

这里的操作用单引号括起来,表示第 3 行和第 7 行,并且使用了 p 打印出符合匹配规则的数据。sed 的默认行为是在解析后打印每一行。这意味着由于使用了 p ,第 3 行到第 7 行打印了两次。

如何打印文件中特定的行?使用 -n 选项来消除在输出中不匹配的行:

$ sed -n '3,7 p' data
3    Willis Castillo     21    Windows
4    Gilberto Mack    30   Windows
5    Aubrey Hayes     17   windows
6    Allan Snyder       21   mac
7    Freddie Dean      25  linux

使用 ‘-n’ 仅仅只有第 3 行到第 7 行会被打印。

省略文件中的特定行。使用 d 从输出中删除行:

$ sed '3 d' data
1    Vicky Grant      20    linux
2   Nora Burton     19    Mac
4   Gilberto Mack  30    Windows
5   Aubrey Hayes   17    windows
6   Allan Snyder     21    mac
7   Freddie Dean    25   linux
8   Ralph Martin    19    linux
9   Mindy Howard  20   Mac

$ sed '5,9 d' data
1    Vicky Grant     20   linux
2   Nora Burton    19   Mac
3   Willis Castillo   21   Windows
4   Gilberto Mack 30   Windows

从文件中搜索特定的关键字:

$ sed -n '/linux/ p' data
7    Freddie Dean   25  linux
8    Ralph Martin   19   linux

$ sed -n '/linux/I p' data
1     Vicky Grant      20  Linux
7     Freddie Dean  25  linux
8     Ralph Martin   19  linux

在这些例子中,我们在 / / 中使用了一个正则表达式。如果文件中有类似的单词,但大小写不一致,可以使用 I 使得搜索不区分大小写。回想一下,-n 删除了输出中不匹配的行。

替换文件中的单词:

$ sed 's/linux/linus/' data
1   Vicky Grant      20   Linux
2   Nora Burton    19   Mac
3   Willis Castillo   21   Windows
4   Gilberto Mack  30  Windows
5   Aubrey Hayes   17  windows
6   Allan Snyder     21  mac
7   Freddie Dean    25 linus
8   Ralph Martin    19  linus
9   Mindy Howard 20  Mac

这里 s/ / / 表示它是一个正则表达式。在两个 / 之间的就是定位的单词和需要替换的新单词。

tr

tr 命令可以用来转换或删除字符。它可以将小写字母转换为大写字母,也可以将大写字母转换为小写字母,可以消除重复字符,也可以删除特定字符。

tr 的奇怪之处在于,它不同于 wcsortsed 那样接受文件作为输入。我们使用 | (管道符)为 tr 命令提供输入。

$ cat filename | tr [OPTION]

tr 命令使用的一些选项:

  • -d 删除给定输入第一个集合中的指定字符,不做转换
  • -s 将重复出现的字符替换为单个

tr 示例

现在让我们使用 tr 命令将 letter 文件中的所有小写字符转换为大写字符:

$ cat letter
Linux is too easy to learn,
And you should try it too.

$ cat letter | tr 'a-z' 'A-Z'
LINUX IS TOO EASY TO LEARN,
AND YOU SHOULD TRY IT TOO.

这里的 a-zA-Z 表示我们想要将 az 范围内的小写字符转换为大写字符。

删除文件中的 o 字符:

$ cat letter | tr -d 'o'
Linux is t easy t learn,
And yu shuld try it t.

从文件中压缩字符 o 意味着如果 o 在文件中重复出现,那么它将会被删除并且只打印一次:

$ cat letter | tr -s 'o'
Linux is to easy to learn,
And you should try it to.

总结

这是使用 wcsortsedtr 命令的快速演示。这些命令可以方便快捷的操作终端上的文本文件。你可以使用 man 命令来了解这些命令的更多信息。


via: https://fedoramagazine.org/command-line-quick-tips-wc-sort-sed-and-tr/

作者:mahesh1b 选题:lujun9972 译者:perfiffer 校对:wxy

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

在复杂的 IT 基础设施中,有许多重复性任务。成功运行这些任务并不容易。运行失败大多数是人为错误引发。在 Ansible 帮助下,你可以通过远程主机来执行所有任务,这些远程主机按照 行动手册 playbook 执行,行动手册可以根据需要重复使用多次。在本文中,你将学习如何在 Fedora Linux 上安装、配置 Ansible,以及如何使用它来管理、配置 Podman 容器。

Ansible

Ansible 是一个由红帽赞助的开源基础设施自动化工具。它可以处理大型基础设施带来的所有问题,例如安装和更新软件包、备份、确保特定服务持续运行等等。你用 YAML 写的行动手册来做这些事。Ansible 行动手册可以反复使用,使系统管理员的工作不那么复杂。行动手册减少了重复任务,并且可以轻松修改。但是我们有很多像 Ansible 一样的自动化工具,为什么要用它呢?与其他一些配置管理工具不同,Ansible 是无代理的:你不必在受管节点上安装任何东西。

Podman

Podman 是一个开源的容器引擎,用于开发、管理和运行容器镜像。但什么是容器呢?每当你创建任何新应用程序并将其部署在物理服务器、云服务器或虚拟机上时,你面临的最常见问题是可移植性和兼容性。这就是容器出现的原因。容器在操作系统级别上进行虚拟化,因此它们只包含所需的库和应用程序服务。容器的好处包括:

  • 便携性
  • 隔离性
  • 扩展性
  • 轻量级
  • 快速启动
  • 更小的磁盘和内存需求

简而言之:当你为任何应用程序构建容器镜像时,所有必需的依赖项都被打包到容器中。你现在可以在任何主机操作系统上运行该容器,没有任何可移植性和兼容性问题。

Podman 的关键亮点在于它没有守护程序,因此不需要 root 权限来运行容器。你可以借助 Dockerfile 构建容器镜像,或者从 Docker Hub、fedoraproject.orgQuay 上拉取镜像。

为什么用 Ansible 配置 Podman?

Ansible 提供了一种轻松多次运行重复任务的方法。它还为云提供商(如 AWS、GCP 和 Azure)、容器管理工具(如 Docker 和 Podman)与数据库管理提供了大量模块。Ansible 还有一个社区(Ansible Galaxy),在这里你可以找到大量 Ansible 角色 Roles ,它们由来自世界各地的贡献者创建。因为这些,Ansible 成为了 DevOps 工程师和系统管理员手中的好工具。

借助 DevOps,应用程序的开发步伐很快。开发的应用不局限于任意操作系统,这点至关重要。这就是 Podman 出现的地方。

安装 Ansible

首先,安装 Ansible:

$ sudo dnf install ansible -y

配置 Ansible

Ansible 需要在受管节点上运行 ssh,所以首先生成一个 密钥对 Key Pair

$ ssh-keygen

生成密钥后,将密钥复制到受管节点。

输入 yes,然后输入受管节点的密码。现在可以远程访问受管主机。

为了能够访问受管节点,你需要将所有主机名或 IP 地址存储在清单文件中。默认情况下,这是在 ~/etc/ansible/hosts

这是 库存 inventory 文件的样子。方括号用于将组分配给某些特定的节点。

[group1]
green.example.com
blue.example.com
[group2]
192.168.100.11
192.168.100.10

检查所有受管节点是否可以到达。

$ ansible all -m ping

你可以看到如下输出:

[mahesh@fedora new] $ ansible all -m ping
fedora.example.com I SUCCESS {
    "ansibe_facts": {
       "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
[mahesh@fedora new] $

现在创建你的第一个 行动手册 playbook ,它将在受管节点上安装 Podman。首先用 .yml 拓展名创建一个任意名称的文件。

$ vim name_of_playbook.yml

行动手册应该如下所示。第一个字段是行动手册的名称。主机字段(hosts)用于提及清单中提到的主机名或组名。become: yes 表示升级权限,以及任务(tasks)包含所要执行的任务,这里的名称(name)指定任务(tasks)名称,yum 是安装软件包的模块,下面在名称字段(name)指定软件包名称,在状态字段(state)指定安装或删除软件包。

---
 - name: First playbook
   hosts: fedora.example.com
   become: yes
   tasks:
     - name: Installing podman.
       yum:
         name: podman
         state: present

检查文件中是否有语法错误:

$ ansible-playbook filename --syntax-check

现在运行行动手册:

$ ansible-playbook filename

你可以看到如下输出:

[mahesh@fedora new] $ ansible-playbook podman_installation.yml
PLAY [First playbook] *************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************
0k: [fedora.example.com]

TASK [Installing podman] ************************************************************************************************
changed: [fedora.example.com]

PLAY RECAP *************************************************************************************************
fedora.example.com    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
[mahesh@fedora new] $

现在创建一个新的行动手册,从 Docker Hub 中拉取一个镜像。你将使用 podman_image 模块从 Docker Hub 中提取版本号为 2-alpine 的 httpd 镜像。

---
 - name: Playbook for podman.
    hosts: fedora.example.com
    tasks:
     - name: Pull httpd:2-alpine image from dockerhub.
       podman_image:
         name: docker.io/httpd
         tag: 2-alpine

现在检查已拉取的镜像:

[mahesh@fedora new] $ podman images
REPOSITORY                           TAG                  IMAGE ID           CREATED             SIZE
docker.io/library/httpd       2-alpine         fa848876521a    11 days ago        57 MB

[mahesh@fedora new] $

创建一个新的行动手册来运行 httpd 镜像。更多信息请查看 podman\_container 模块文档。

---
 - name: Playbook for podman.
   hosts: fedora.example.com
   tasks:
     - name: Running httpd image.
       containers.podman.podman_container:
         name: my-first-container
         image:  docker.io/httpd:2-alpine
         state: started

检查容器运行状态。

[mahesh@fedora new] $ podman ps
CONTAINER ID        IMAGE    COMMAND   CREATED      STATUS         PORTS         NAMES
45d966eOe207     docker.io/library/httpd:2-alpine    httpd-foreground    13 seconds ago    Up 13 seconds ago       my-first-container

[mahesh@fedora new] $

现在停止已运行的容器,改变状态,由 started 变为 absent

- name: Stopping httpd container.
  containers.podman.podman_container:
    name: my-first-container
    image: docker.io/httpd:2-alpine
    state: absent

当你执行 podman ps 命令时,你看不到任何运行的容器。

[mahesh@fedora new] $ podman ps
CONTAINER ID    IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES

[mahesh@fedora new] $

podman_container 可以做很多事情,例如重新创建容器、重新启动容器、检查容器是否正在运行等等。有关执行这些操作的信息,请参考 文档


via: https://fedoramagazine.org/using-ansible-to-configure-podman-containers/

作者:mahesh1b 选题:lujun9972 译者:DCOLIVERSUN 校对:wxy

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