让你的 Linux 命令骚起来
- 2020 年 1 月 27 日
- 筆記
目录
- 管道符号 “ | ”
- grep
- sed
- awk
- sort
- comm
- uniq
- tr
- cat
- head
- tail
- wc
- find
- tsort
- tee
- 「>」重定向符号
- 「<」重定向符号
- 混淆 Unicode 结果
- 直接从数据库管道
- 总结
本文将为读者提供许多不同 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 的文件,其中包含了注册你邮件的人的电子邮件地址:
[email protected] [email protected] [email protected] [email protected] [email protected]
以及另一个名为 purchases.txt 的文件,其中包含购买你的产品的人的电子邮件地址:
[email protected] [email protected] [email protected] [email protected]
对于这些文件,您可能想知道三个不同问题的答案: 1)哪些用户注册并购买了产品? 2)哪些用户注册了时事通讯,但没有转换为购买? 3)哪些用户进行了购买但没有注册订阅时事通讯? 使用 comm 命令,您可以轻松地回答所有这三个问题。 这里有一个命令,我们可以用来找到那些注册了时事通讯并且购买了它的用户:
comm -12 signups.txt purchases.txt
结果如下:
[email protected] [email protected]
以下是我们如何找到那些注册了时事通讯但没有转化的用户:
comm -23 signups.txt purchases.txt
结果如下:
[email protected] [email protected] [email protected]
最后,这里有一个指令,显示了那些没有对着时事通讯唱歌就购买商品的人:
comm -13 signups.txt purchases.txt
结果如下:
[email protected] [email protected]
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 "Hellor" | tr -d "r" | xxd
您还可以使用‘ tr’命令进行其他特殊情况下的更正,这些更正可能需要在其他一些 unix 管道中应用。 例如,有时可能会遇到使用空字符分隔代替换行的二进制数据。 可以使用以下 tr 命令用换行代码替换文件中的所有空字符:
echo -en "