如何在 Linux 上使用 seq 命令

Linux seq
命令可在眨眼间生成数字列表。但是如何才能将此功能付诸实践呢?我们将向您展示 seq 如何为您派上用场。
序列命令
乍一看,Linux seq
命令似乎有些古怪。它允许您快速生成数字序列,仅此而已!不过,这里的关键词是“快速”。稍后,您就会看到这个小命令的运行速度有多快。
但是,不管它们是如何生成的,数字列表有多大用处? seq
命令于 1985 年被添加到 Unix 的第 8 版中。从那以后它就一直存在,所以它一定做了一些有价值的事情。
Unix 的哲学是它充满了只做一件事并且把它做好的小实用程序。这种哲学的核心原则之一是编写接受来自其他程序的输入的程序。当然,这也意味着这些程序必须生成可用作其他程序输入的输出。
当 seq
命令与其他使用其输出的命令一起使用时(通过管道或命令行扩展),它就会发挥作用。
基本列表生成
如果您使用单个数字作为命令行参数启动 seq
,它会从 1 计数到该数字。然后它在终端窗口中打印数字,每行一个数字,如下所示:
seq 6

如果您在命令行中键入两个数字,第一个将是起始编号,第二个将是结束编号,如下所示:
seq 4 10

您可以通过包含第三个数字来设置步长。它位于开始和结束数字之间。我们键入以下内容以请求 seq
创建一个数字列表,该列表以 6 开头,以 48 结尾,并使用 6 为步长:
seq 6 6 48

倒数
我们还可以要求 seq
创建一个从最高到最低的数字列表。然而,要做到这一点,我们必须提供一个负面的步骤。
以下命令生成一个列表,该列表以 6 为步长从 24 计数到 12,因为我们将步长键入为负数:
seq 24 -6 12

小数点数
开始、结束和步数也可以是小数。如果任何数字是小数,则其他数字也被视为小数。以下命令生成步长为 0.2 的数字列表:
seq 1 0.2 2

seq的速度
seq
非常快——唯一的瓶颈是您在终端窗口中键入命令所花费的时间。为了测试它的速度,让我们请求一个包含 250,000 个数字的列表。
我们键入以下内容,使用 time
命令查看该过程需要多长时间才能完成:
time seq 250000

结果显示在列表下方。即使在我们中等功率的测试 PC 上,seq
也快得惊人。

整个列表在大约 1/3 秒内创建并写入屏幕。如果我们将列表重定向到一个文件中,我们甚至可以避免在终端窗口中键入的开销。
为此,我们键入以下内容:
time seq 250000 > numbers.txt

完成列表和创建文件所需的时间现在约为 1/7 秒。
使用分隔符
换行符是列表中每个数字之间显示的默认字符。这就是为什么它们显示为垂直列表,每个数字都在自己的行上。如果需要,您可以提供另一个分隔符。
例如,假设您需要创建一个以逗号分隔的列表、一个以冒号分隔的列表或任何其他标点符号或符号。分隔符实际上是一个字符串,因此您可以使用多个字符。
我们将使用 -s
(分隔符)选项。以下命令将生成一个以逗号分隔的列表:
seq s, 6 6 36
此命令将使用冒号 (:
) 作为分隔符:
seq -s: 6 6 36
此命令告诉 seq
使用两个连字符 (-
) 作为分隔符:
seq -s-- 6 6 36

使用格式字符串
seq
命令还支持 C 语言风格的格式化字符串。这些允许您使用比仅指定分隔符更多的控制来格式化输出。要使用格式字符串,您可以使用 -f
(格式)选项。
以下命令告诉 seq
使用零将输出填充为两个字符:
seq -f "%02g" 6

我们可以用我们喜欢的任何文本格式化字符串,并将数字放在字符串中的任意位置,如下所示:
seq -f "Number %02g in a C-like format string" 6

设置零填充的快速方法
设置零填充的最快方法是使用 -w
(等宽)选项。这告诉 seq
使用零来填充数字,因此它们的宽度都与最大数字相同。
以下命令以 100 为步长从 0 到 1,000 计数,所有数字都将用零填充:
seq -w 0 100 1000

最长的数字需要四个字符,所以所有较窄的数字都用零填充到那个宽度(即使是 0 也被填充到四个零)。
管道 seq 进入 bc
通过将分隔符设置为数学符号并将列表传送到 bc
命令中,我们可以计算该列表中的数字。
以下命令生成一个由星号 (*
) 分隔的数字列表,从 1 开始到 6 结束:
seq -s* 6
如果我们将该列表输入 bc
,它会使用星号 (*
) 作为乘法符号来评估列表:
seq -s* 6 | bc
我们也可以用其他符号来做到这一点。下面的命令使用加号 (+
) 创建一个列表,其中添加了所有数字:
seq -s+ 5
我们键入以下内容以将其通过管道传输到 bc
并评估列表:
seq -s+ 5 | bc

使用 seq 创建文件
touch
命令更新文件上的时间和日期戳。如果文件不存在,触摸创建它。我们可以使用带有 touch
和 seq
的命令行扩展来创建按主题命名但编号不同的文件集合。
我们将创建一组 10 个具有相同基本名称和不同编号的文件(file-1.txt、file-2.txt 等)。我们键入以下内容:
touch $(seq -f "file-%g.txt" 1 10)
然后,我们键入以下内容来检查文件:
ls file*

在 Bash 循环中使用 seq
我们可以在 Bash 脚本中使用 seq
来控制带小数的循环。
在编辑器中键入以下文本,然后将其保存为“loops.sh”:
#!/bin/bash
for val in $(seq 5 0.2 6.6); do
echo "The value is now: $val"
done
接下来,我们键入以下内容以使我们的新脚本可执行:
chmod +x loop.sh

当我们运行脚本时,循环计数器会打印在终端窗口中。然后我们可以键入以下内容以查看十进制循环计数器随着循环的每次迭代而增加:
./loop.sh

请记住 seq
也可以倒数;您可以以相同的方式在循环中使用它。
漂亮而简单
seq
的一件事是没有太多的学习曲线。它有一个非常简短的 man
页面,但您仍然可以以有趣的方式使用它。
因为我们经常需要快速创建具有实际大小的测试文件,所以我们将 seq
与格式字符串一起使用。然后我们重定向输出以创建一个包含任意多行虚拟数据的文件。
Linux Commands | ||
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc | |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts