让你的 Linux 命令骚起来

本文将为读者提供许多不同 Linux 命令的简要概述。 将特别强调解释如何在执行数据科学任务的上下文中使用每个命令。 我们的目标是让读者相信这些命令中的每一个都非常有用,并且让他们了解每个命令在操作或分析数据时可以扮演什么角色。

管道符号 “ | ”

许多读者可能已经熟悉了“ | ”符号,但是如果不熟悉的话,值得提前指出: 下面几节中讨论的命令的所有输入和输出都可以使用“ | ”符号自动“管道”输入到彼此中! 这意味着每个命令完成的所有特殊任务都可以链接在一起,从而生成非常强大和简短的迷你程序,所有这些都直接在命令行上完成!

grep

什么是 grep? “ grep”是一个可用于从文件中提取匹配文本的工具。 您可以指定许多不同的控件标志和选项,这些标志和选项允许您非常有选择性地确定希望从文件或流中提取哪些文本子集。 Grep 通常用作“面向行”的工具,这意味着在找到匹配的文本时,Grep 将打印该行上的所有文本,尽管您可以使用“-o”标志只打印匹配的行部分。

为什么 grep 是有用的? “ grep”很有用,因为它是在大量文件中搜索特定文本块的最快方法。 一些很好的用例有: 从巨大的 web 服务器日志中过滤访问特定的 web 页面; 为特定关键字的实例搜索代码库(这比使用 Eclipse Editor 的搜索要快得多,也更可靠) ; 在 Unix 管道中过滤另一个命令的输出。

Grep 与数据科学有什么关系? Grep 对于特定的数据科学任务非常有用,因为它允许您非常快速地从数据集中筛选出所需的信息。 很可能您的源数据中包含大量与您试图回答的问题无关的信息。 如果数据存储在文本文件中的单个行中,则可以使用 grep 只提取要处理的行,如果您能够想到一个非常精确的搜索规则来过滤它们的话。 例如,如果你有下面的。 Csv 文件,每一行都有销售记录:

item, modelnumber, price, tax
Sneakers, MN009, 49.99, 1.11
Sneakers, MTG09, 139.99, 4.11
Shirt, MN089, 8.99, 1.44
Pants, N09, 39.99, 1.11
Sneakers, KN09, 49.99, 1.11
Shoes, BN009, 449.22, 4.31
Sneakers, dN099, 9.99, 1.22
Bananas, GG009, 4.99, 1.11

你可以使用这样的命令:

grep Sneakers sales.csv

只过滤掉包含文字“运动鞋”的销售记录。 下面是运行这个命令的结果:

Sneakers, MN009, 49.99, 1.11
Sneakers, MTG09, 139.99, 4.11
Sneakers, KN09, 49.99, 1.11
Sneakers, dN099, 9.99, 1.22

您还可以使用带有 grep 的复杂正则表达式来搜索包含某些模式的文本。 例如,这个命令将使用 grep 过滤掉所有以“ BN”或“ MN”开头,后面至少跟有3个数字的型号:

grep -o "\(BN\|MN\)\([0-9]\)\{3\}" sales.csv

下面是运行这个命令的结果:

MN009
MN089
BN009

sed

什么是 sed? Sed 是一个用于执行搜索和替换操作的工具。 例如,你可以使用以下命令:

sed -i 's/dog/cat/g' *

将工作目录中所有文件中的“ dog”替换为“ cat”。

为什么 sed 有用? “ sed”非常有用,因为您可以使用正则表达式执行复杂的匹配和替换。 正则表达式替换还支持回溯引用,允许您匹配任意模式,然后以某种方式只更改匹配文本的一部分。 例如,这个 sed 命令将在任何给定行上查找两个带引号的字符串,然后在不更改文本的任何其他部分的情况下交换它们的位置。 它还同时将引号变成括号:

echo 'The "quick brown" fox jumped over the "lazy red" dog.' | sed -E 's/"([^"]+)"([^"]+)"([^"]+)"/(\3)\2(\1)/'

结果如下:

The (lazy red) fox jumped over the (quck brown) dog.

Sed 与数据科学有什么关系? Sed 在数据科学中最大的用例是,如果您想使用它,那么您的数据可能不完全符合所需的格式。 例如,如果你的老板给你一个文本文件 data.txt,其中包含数千个错误地用双引号括起来的数字:

age,value
"33","5943"
"32","543"
"34","93"
"39","5943"
"36","9943"
"38","8943"

可以通过以下 sed 命令运行该文件:

cat data.csv | sed 's/"//g'

取消所有任务,得到以下结果:

age,value
33,5943
32,543
34,93
39,5943
36,9943
38,8943

如果您需要将数字导入到另一个不能使用围绕数字的引号的程序中,这将非常有用。 如果您曾经遇到过一些简单的格式错误导致无法导入或正确处理数据集的问题,那么很有可能有一个 sed 命令可以修复您的问题。

awk

什么是 awk? Awk 是一个可以进行更高级搜索和替换可能需要通用计算的操作的工具。

为什么 awk 有用? Awk 很有用,因为它基本上是一种通用编程语言,可以轻松处理格式化的行文本。 与 sed 可以做的事情有一些重叠,但 awk 要强大得多。 Awk 还可以用于需要记住不同行之间的状态的更改。

Awk 与数据科学有什么关系? 假设你有一个包含温度值的 CSV 文件 temps.CSV,但是文件中没有使用摄氏温度或华氏温度,而是混合了这两种温度,表示摄氏温度的单位为 c,华氏温度的单位为 f:

temp,unit
26.1,C
78.1,F
23.1,C
25.7,C
76.3,F
77.3,F
24.2,C
79.3,F
27.9,C
75.1,F
25.9,C
79.0,F

你可以用一个简单的 awk 命令来完成这个任务:

cat temps.txt | awk -F',' '{if($2=="F")print (($1-32)*5/9)",C";else print $1","$2}'

结果将会是:

temp,unit
26.1,C
25.6111,C
23.1,C
25.7,C
24.6111,C
25.1667,C
24.2,C
26.2778,C
27.9,C
23.9444,C
25.9,C
26.1111,C

将所有温度值标准化为摄氏度。

sort

什么是sort? sort的名字暴露了一切: 它是用来排序的!

为什么sort是有用的? 单独进行排序并不是很有用,但是对于许多其他任务来说,这是一个重要的先决条件: 想要找到最大 / 最小的? 只要把它们分类,然后拿走第一个或最后一个。 想要前十名吗? 把它们分类,然后拿走最后的10个。 需要数字排序还是字典排序? Sort 命令可以两者兼顾! 让我们用几种不同的方式来排序以下随机文本 foo.txt 文件:

0 1 1234 11 ZZZZ 1010 0123 hello world abc123 Hello World 9 zzzz

下面是一个执行默认排序的命令:

cat foo.txt | sort

结果就是:

0
0123
1
1010
11
1234
9
abc123
Hello World
hello world
ZZZZ
zzzz

请注意,上面的排序是字典序,而不是数字顺序,所以数字可能不是您期望的顺序。 我们可以用数字排序来代替使用’-n’标志:

cat foo.txt | sort -n

结果如下:

0
abc123
Hello World
hello world
ZZZZ
zzzz
1
9
11
0123
1010
1234

现在这些数字的顺序是正确的。 另一个常见的要求是按照相反的顺序排序,你可以使用’-r’标志:

cat foo.txt | sort -r

结果如下:

zzzz ZZZZ hello world Hello World abc123 9 1234 11 1010 1 0123 0

排序和数据科学有什么关系? 本文中其他几个与数据科学相关的 Linux 命令(comm、 uniq 等)要求您首先对输入数据进行排序。 “排序”命令的另一个有用的标志是“-r”标志,它将随机重新排列输入的行。 这对于为其他需要工作的软件开发大量测试用例非常有用,不管文件中行的顺序如何。

comm

什么是comm? comm 是一个计算集合操作结果的工具: (联合、交叉和补充)基于输入文件中的文本行。

为什么comm是有用的? 如果您想了解两个不同文件中常见或不同的行,Comm 非常有用。

comm与数据科学有什么关系? 如果你有两个电子邮件地址列表: 一个名为 signups.txt 的文件,其中包含了注册你邮件的人的电子邮件地址:

68_so_late@hotmail.com
fred@example.com
info@info.info
something@somewhere.com
ted@example.net

以及另一个名为 purchases.txt 的文件,其中包含购买你的产品的人的电子邮件地址:

example@gmail.com
fred@example.com
mark@facebook.com
something@somewhere.com

对于这些文件,您可能想知道三个不同问题的答案: 1)哪些用户注册并购买了产品? 2)哪些用户注册了时事通讯,但没有转换为购买? 3)哪些用户进行了购买但没有注册订阅时事通讯? 使用 comm 命令,您可以轻松地回答所有这三个问题。 这里有一个命令,我们可以用来找到那些注册了时事通讯并且购买了它的用户:

comm -12 signups.txt purchases.txt

结果如下:

fred@example.com
something@somewhere.com

以下是我们如何找到那些注册了时事通讯但没有转化的用户:

comm -23 signups.txt purchases.txt

结果如下:

68_so_late@hotmail.com
info@info.info
ted@example.net

最后,这里有一个指令,显示了那些没有对着时事通讯唱歌就购买商品的人:

comm -13 signups.txt purchases.txt

结果如下:

example@gmail.com
mark@facebook.com

Comm 命令要求传递给它的任何输入首先进行排序。 通常,你的输入文件不会被预先排序,但是你可以在 bash 中使用以下语法直接使用 sort 命令将输入传递给 comm,而不需要创建任何额外的文件:

comm -12 <(sort signups.txt) <(sort purchases.txt)

uniq

什么是 uniq? “ uniq”命令帮助您回答有关唯一性的问题。

为什么 uniq 有用? 如果您想要去除重复的行并且只输出唯一的行,uniq 可以做到这一点。 想知道每个项目被复制了多少次? 优衣库会告诉你的。 希望仅 * * 输出重复的项目(例如,对应该是唯一的健全检查输入) ? 你也可以这么做。

Uniq 与数据科学有什么关系? 假设你有一个名为‘ sales.csv’的充满销售数据的文件:

Shoes,19.00
Shoes,28.00
Pants,77.00
Socks,12.00
Shirt,22.00
Socks,12.00
Socks,12.00
Boots,82.00

你需要一份数据集中所有独特产品的简明列表。 你只需要使用 awk 获取产品并将结果导入 sort,然后使用 uniq:

cat sales.csv | awk -F',' '{print $1}' | sort | uniq

结果如下:

Boots
Pants
Shirt
Shoes
Socks

接下来你可能想知道的是每件独一无二的商品卖出了多少:

cat sales.csv | awk -F',' '{print $1}' | sort | uniq -c

结果如下:

1 Boots
1 Pants
1 Shirt
2 Shoes
3 Socks

您还可以使用带 uniq 的’-d’标志来获取多次出现的项目列表。 这在处理几乎是唯一的列表时非常有用。

tr

什么是 tr? Tr 命令是一个可以移除或替换单个字符或字符集的工具。

为什么 tr 有用? 我发现使用 tr 命令最常见的原因是删除 Windows 机器上创建的文件中不需要的回车字符。 下面的例子说明了这一点,并将结果导入到 xxd 中,这样我们就可以检查十六进制:

echo -en "Hello\r" | tr -d "\r" | xxd

您还可以使用‘ tr’命令进行其他特殊情况下的更正,这些更正可能需要在其他一些 unix 管道中应用。 例如,有时可能会遇到使用空字符分隔代替换行的二进制数据。 可以使用以下 tr 命令用换行代码替换文件中的所有空字符:

echo -en "\0" | tr \\0 \\n | xxd

请注意,上面命令中的双精度’’字符是必需的,因为 tr 期望“0”表示 null 字符,但是‘’本身需要在 shell 上进行转义。 上面的命令显示了输入到 xxd 中的结果,这样您就可以验证结果了。 在实际的用例中,您可能不希望在这个管道的末尾使用 xxd。

Tr 与数据科学有什么关系? Tr 命令与数据科学的关系并不像这里列出的其他命令那样深刻,但它通常是特殊情况下必不可少的补充,在处理数据的另一个阶段可能需要进行修复和清理。

cat

什么是cat? Cat 命令是一个工具,您可以使用它将文件连接在一起并将其打印到 stdout。

为什么cat有用? 当您需要将多个文件缝合在一起,或者需要将文件输出到 stdout 时,cat 命令非常有用。

cat与数据科学有什么关系? 在执行数据科学任务时,“ cat”命令的“ concating”特性确实会出现很多问题。 一个常见的情况是,遇到多个 csv 文件,其中包含要聚合的格式类似的内容。 假设你有3个。 Csv 文件的电子邮件地址从时事通讯注册,购买,和购买列表。 您可能需要计算所有用户数据的潜在影响范围,因此需要计算所有3个文件中的独立电子邮件数量。 你可以使用 cat 把它们一起打印出来,然后使用 sort 和 uniq 打印出一组独特的电子邮件:

cat signups.csv purchases.csv purchased.csv | awk -F'\t' '{print $1}' | sort | uniq

很可能你已经习惯看到人们使用 cat 来读取文件并将其导入到其他程序中:

cat file.txt | somecommand

你也会偶尔看到人们指出这是 cat 的一个无用的用法,不是必须的,因为你可以用这个语法来代替:

somecommand < file.txt

head

head是什么? “ head”命令只允许您打印文件的前几行(或字节)。

为什么head是有用的? 如果您希望查看一个巨大(许多 GiB)文件的一小部分,或者您希望计算分析的另一部分得到的“ top 3”结果,那么这是非常有用的。

head如何与数据科学联系起来? 假设您有一个文件“ sales.csv” ,其中包含您所销售产品的销售数据列表:

Shoes,19.00
Shoes,19.00
Pants,77.00
Pants,77.00
Shoes,19.00
Shoes,28.00
Pants,77.00
Boots,22.00
Socks,12.00
Socks,12.00
Socks,12.00
Shirt,22.00
Socks,12.00
Boots,82.00
Boots,82.00

你可能想知道下面这个问题的答案: “从最受欢迎到最不受欢迎的前三名产品是什么? ” . 你可以用下面的管道来回答这个问题:

cat sales.csv | awk -F',' '{print $1}' | sort | uniq -c | sort -n -r | head -n 3

上面的 shell 管道将销售数据输入到 awk 中,并且只打印每行的第一列。 然后我们对产品名称进行排序(因为“ uniq”程序要求我们对数据进行排序) ,然后使用“ uniq”来获得唯一产品的计数。 为了对产品计数列表从最大到最小进行排序,我们使用‘ sort-n-r’对产品计数进行数值排序。 然后,我们可以通过管道将完整的列表输入到 head-n 3中,只能看到列表中的前三项:

4 Socks
4 Shoes
3 Pants

tail

什么是tail? ‘ tail’命令是‘ head’命令的一个附属命令,因此您可以预期它的工作方式与‘ head’命令类似,只是它打印文件的结尾而不是开始。

为什么tail是有用的? ‘ tail’命令对于‘ head’命令有用的所有任务都很有用。

tail和数据科学有什么关系? 下面是一个例子,说明如何使用下面的命令来计算上一节中销售数据的底部3个产品:

cat sales.csv | awk -F',' '{print $1}' | sort | uniq -c | sort -n -r | tail -n 3

结果就是:

 3 Pants
3 Boots
1 Shirt

请注意,这可能不是您想要的演示格式,因为最低计数位于底部。 要查看输出顶部的最低计数,你可以使用‘ head’命令,而不需要倒序排序:

cat sales.csv | awk -F',' '{print $1}' | sort | uniq -c | sort -n | head -n 3

结果就是:

1 Shirt
3 Boots
3 Pants

Tail 命令的另一个很好的用例是删除文件的第一行。 例如,如果你有这样的 CSV 数据:

product,price
Shoes,19.00
Shoes,28.00
Pants,77.00
Socks,12.00
Shirt,22.00

你试着用 awk 和 uniq 来计算不同的产品,如下所示:

cat sales.csv | awk -F',' '{print $1}' | sort | uniq -c

你最终会得到如下输出:

1 Pants
1 product
1 Shirt
2 Shoes
1 Socks

包含了头部的“产品”这个词,我们并不想要这个词。 我们需要做的是修剪标题行,并开始只处理剩余行上的数据(在我们的例子中是第2行)。 我们可以使用‘ tail’命令,在输出数据的行号(基于1的索引)前加上‘ + ’:

cat sales.csv | tail -n +2 | awk -F',' '{print $1}' | sort | uniq -c

现在我们得到了期望的结果与头部省略:

1 Pants
1 Shirt
2 Shoes
1 Socks

wc

Wc 是什么? Wc 命令是一个工具,您可以使用它来获取单词计数和行计数。

为什么 wc 有用? 当您想要快速回答“有多少行? ”这个问题时,这个命令非常有用 或者这是多少个字符 .

Wc 与数据科学有什么关系? 很多情况下,很多快速问题可以改为“这个文件有多少行? ” 想知道你的邮件列表中有多少封邮件吗? 你可以使用这个命令:

wc -l emails.csv

并可能从结果中减去一(如果文件中包含 csv 头)。

如果你在工作目录文件夹中有多个文件,你想要计算所有文件的行数(包括总行数) ,你可以使用通配符:

wc -l *.csv

计算一段文本或一个文件中的字符数通常很有用。 您甚至可以将文本粘贴到 echo 语句中(使用-n 来避免换行符,因为换行符会使计数增加1) :

echo -n "Here is some text that you'll get a character count for" | wc -c

结果就是:

55

find

什么是find? “ find”命令可以使用许多不同的选项搜索文件,它还可以对每个文件执行命令。

为什么find是有用的? Find 命令对于搜索给定多个不同选项(文件 / 目录类型、文件大小、文件权限等)的文件非常有用,但它最有用的特性之一来自“-exec”选项,该选项允许您在找到文件后对其执行命令。

find与数据科学有什么关系? 首先,让我们展示一个例子,说明如何使用 find 命令列出工作目录文件夹中和下面的所有文件:

find .

正如您在上面的 wc 命令中看到的,您可以计算工作目录文件中所有文件的行数。 然而,如果你想对所有的文件、目录和子目录进行迭代来得到每个文件的总行数(例如在你的代码库中进行总行数) ,你可以使用 find 来打印每个文件的文本,然后通过管道将每个文件的 * 聚合 * 输出输入到‘ wc’来得到行数:

find . -type f -exec cat {} \; | wc -l

当然,您可以通过更改‘ . ’来在除工作目录目录以外的其他特定目录上运行类似于上面的命令 成为你想要的目录。 只是要小心运行‘-exec’的 find,特别是如果你是作为 root 用户运行的话! 如果不小心对“ / ”目录运行了错误的命令,可能会造成很大的损害。

tsort

什么是tsort? “ tsort”是一个可以用来执行拓扑排序的工具。

为什么它是有用的? “拓扑排序”是许多现实世界中的问题的解决方案,这些问题你可能每天都会遇到,却没有注意到。 一个非常著名的例子是提出一个时间表来完成一些任务,这些任务在上一个任务完成之前是不能开始的。 这样的考虑是必要的在建筑工程,因为你不能完成的工作,油漆墙,直到干墙已经安装。 你不能安装干墙,直到电力工作已经完成,你不能完成电力工作,直到墙壁框架已经完成等。 如果你只是在建房子,你也许可以把这些都记在脑子里,但是大型建筑项目需要更多的自动化方法。 让我们在 task dependencies.txt 文件中回顾一个使用构造任务来构建房屋的示例:

wall_framing foundation
foundation excavation
excavation construction_permits
dry_wall electrical
electrical wall_framing
wall_painting crack_filling
crack_filling dry_wall

在上面的文件中,每一行由两个“单词”组成。 当“ tsort”命令处理文件时,它将假定第一个单词描述了需要在第二个单词之后出现的内容。 在处理完所有行之后,“ tsort”将按照大多数下游依赖项到最少的下游依赖项的顺序输出所有单词。 现在让我们试一下:

cat task_dependencies.txt | tsort

结果如下:

wall_painting
crack_filling
dry_wall
electrical
wall_framing
foundation
excavation
construction_permits

您可能还记得上面的内容,您可以使用带有“ sort”命令的“-r”标志来获得文件中行的随机排序。 如果我们在依赖项列表中重复“随机”排序,并将其导入 tsort,你会发现结果总是相同的,尽管“ sort-r”的输出每次都不同:

cat task_dependencies.txt | sort -R | tsort

这是因为即使我们在这个文件中重新排列行,任务相互依赖的实际顺序也不会改变。

这仅仅触及了拓扑排序的一点皮毛,但是希望这能激起你足够的兴趣,让你去查看*关于拓扑排序的页面

这和数据科学有什么关系? 拓扑排序是一个基本的图论问题,出现在很多地方: 机器学习; 物流; 调度; 项目管理等。

tee

Tee 是什么? “ tee”命令是一个工具,它允许您将流信息分离到一个文件中,同时还可以将其打印到当前流的输出中。

Tee 与数据科学的关系如何? “ tee”命令实际上不会为您做任何分析工作,但是如果您试图调试为什么复杂的 shell 管道无法工作,那么它会非常有用。 让我们以上面的一个例子为例,在管道的每个阶段之间放置对‘ tee’命令的引用:

cat sales.csv | tail -n +2 | tee after_tail.log | awk -F',' '{print $1}' | tee after_awk.log | sort | tee after_sort.log | uniq -c | tee after_uniq.log

现在,当您运行这个命令时,您将得到4个文件,它们都显示了流程中每个阶段的输出是什么样的。 如果您希望能够返回并检查经历过罕见或复杂错误的 shell 管道,那么这可能非常方便。 复杂的正则表达式通常用在这样的管道中,有时候可以匹配你不希望它们匹配的东西,所以使用这种方法你可以很容易地获得更深入的了解每一个阶段是怎么回事。

「>」重定向符号

符号是一个输出重定向符号,可用于重定向输出。可用于重定向输出文件,而不是将其打印到屏幕上。

cat sales.csv | tail -n +2 | awk -F',' '{print $1}' | sort | uniq -c > unique_counts.txt

「<」重定向符号

什么是 < ? 符号是一个输出重定向符号,它可以将文件的内容指向程序的输入。 这是上面讨论的无用猫问题的替代方案:

grep Pants < sales.txt

混淆 Unicode 结果

最终会遇到的一个常见问题与混合不同的 Unicode 编码有关。 特别值得注意的是,许多企业软件提供商在进行编码时会选择 UTF-16而不是 UTF-8。 Csv 文件或数据库转储。

例如,假设您希望通过一组文件对单词‘ Hello’的所有实例进行 grep 处理。 首先,您可以检查文件包含的内容:

cat sometext.txt

你可以看到它包含了 Hello 这个文本:

Hello World!

这怎么可能发生? 当你查看十六进制文件时,答案变得更加清晰了:

xxd sometext.txt

给出如下输出:

00000000: fffe 4800 6500 6c00 6c00 6f00 2000 5700  ..H.e.l.l.o. .W.
00000010: 6f00 7200 6c00 6400 2100 0a00 o.r.l.d.!...

这里发生的情况是,文件‘ somefile.txt’以 UTF-16编码,但是您的终端(可能)默认设置为使用 UTF-8。 将 UTF-16编码的文本中的字符打印到 UTF-8编码的终端并没有显示出明显的问题,因为 UTF-16空字符在终端上没有得到表示,但是其他每个奇数字节只是一个看起来与 UTF-8编码相同的常规 ASCII 字符。

正如您在上面的输出中看到的,这个文件并没有使用 UTF-8对文件进行编码,而是使用 UTF-16le。 没有找到文本‘ Hello’ ,因为当您在命令行上为‘ Hello’键入 grep 时,您键入的字符将在当前设置在终端环境(可能设置为 UTF-8)的字符编码文件中进行解释。 因此,搜索字符串不包括这些 ASCII 字符后面额外的空字节,因此搜索失败。 如果你想搜索 UTF-16字符,你可以使用这个 grep 搜索:

grep -aP "H\x00e\x00l\x00l\x00o\x00" * sometext.txt

要打开二进制文件搜索,‘ a’标志是必要的,因为 UTF-16中的空字符会导致文件被 grep 解释为二进制文件。 ‘ p’标志指定 grep 模式应该被解释为一个 Perl 正则表达式,这将导致解释‘ x’转义。

iconv -f UTF-16 -t UTF-8 sometext.txt > sometext-utf-8.txt

现在你在处理这个文件时不需要采取任何特殊的步骤,因为这个编码现在很可能与你的终端当前的编码兼容:

00000000: 4865 6c6c 6f20 576f 726c 6421 0a         Hello World!.

直接从数据库管道

如果你不能使用数据库,你就算不上一个数据科学家。 幸运的是,大多数常见的数据库应用程序都有一些直接从命令行运行即席查询的机制。 请注意,这种做法非常粗糙,根本不推荐用于严肃的调查,而是用于获得快速、低保真的结果。 让我们从使用 Postgres SQL server 的示例开始。 假设您有一个名为 url 的简单数据库表:

DROP TABLE urls;
CREATE TABLE urls (
id serial NOT NULL PRIMARY KEY,
url character varying(1000)
);
insert into urls (url) values ('http://example.com/');
insert into urls (url) values ('http://example.com/foo.html');
insert into urls (url) values ('http://example.org/index.html');
insert into urls (url) values ('http://google.ca/');
insert into urls (url) values ('http://google.ca/abc.html');
insert into urls (url) values ('https://google.ca/404.html');
insert into urls (url) values ('http://example.co.uk/');
insert into urls (url) values ('http://twitter.com/');
insert into urls (url) values ('http://blog.robertelder.org/');

您想要创建一个列表,显示每个域名在这个表中的 url 中是多么常见。 您可以通过创建一个命令来提取 url 数据(对于具有多列的类似查询,可以使用逗号) :

psql -d mydatascience -t -A -F"," -c "select url from urls;"

产生这样的输出:

http://example.com/
http://example.com/foo.html
http://example.org/index.html
http://google.ca/
http://google.ca/abc.html
https://google.ca/404.html
http://example.co.uk/
http://twitter.com/

现在,我们可以在这个管道上添加一个简单的正则表达式,只选择域名:

psql -d mydatascience -t -A -F"," -c "select url from urls;" | sed -E "s/^https?:\/\/([^\/]+).*/\1/"

下面是我们正在研究的清单:

example.com
example.com
example.org
google.ca
google.ca
google.ca
example.co.uk
twitter.com

现在我们可以使用上面提到的 sort / uniq 技巧来得出最终的解决方案:

psql -d mydatascience -t -A -F"," -c "select url from urls;" | sed -E "s/^https?:\/\/([^\/]+).*/\1/" | sort | uniq -c | sort -n -r

Mysql 客户端有一组类似的命令行选项,用于将数据提取到命令行:

mysql ... -s -r -N -e "select 1,2;"

当然,您可能认为您最喜欢的查询语言可以直接在 SQL 命令行上作为单个查询来完成这些操作,但是这里的要点是表明,如果需要,您可以在命令行上完成这些操作。

总结

正如我们在本文中所讨论的,有许多 Linux 命令对于快速解决数据科学问题非常有用。 本文只为每个命令展示了几个有用的标志,但实际上还有几十个。 希望,你的兴趣已经足够激起进一步研究他们。

如果你感兴趣可以关注公众号「chasays」- 程序员汇聚地

让你的 Linux 命令骚起来

上一篇:Log POST Data in Nginx


下一篇:Linux awk+uniq+sort 统计文件中某字符串出现次数并排序