让你的 Linux 命令骚起来

@[toc] 本文将为读者提供许多不一样 Linux 命令的简要概述。 将特别强调解释如何在执行数据科学任务的上下文中使用每一个命令。 咱们的目标是让读者相信这些命令中的每个都很是有用,而且让他们了解每一个命令在操做或分析数据时能够扮演什么角色。html

管道符号 “ | ”

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

grep

什么是 grep? “ grep”是一个可用于从文件中提取匹配文本的工具。 您能够指定许多不一样的控件标志和选项,这些标志和选项容许您很是有选择性地肯定但愿从文件或流中提取哪些文本子集。 Grep 一般用做“面向行”的工具,这意味着在找到匹配的文本时,Grep 将打印该行上的全部文本,尽管您可使用“-o”标志只打印匹配的行部分。程序员

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

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

你可使用这样的命令:sql

grep Sneakers sales.csv

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

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 是一个用于执行搜索和替换操做的工具。 例如,你可使用如下命令:bash

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」- 程序员汇聚地 在这里插入图片描述

相关文章
相关标签/搜索