资源 | 数据科学家必备的21个命令行工具

选自active wizards

机器之心编译

参与:蒋思源

在该篇文章中,我们将介绍用于快速分析存储于文本文件(日志、报文等等)中的数据的便利工具。

通常我们所需要的数据并不储存在电脑本地中。所以首先,我们将探讨如何访问及使用远程服务器。因此,我们需要使用最适配的 SSH(安全外壳协议/Secure Shell:即一种加密网络协议,该协议专为远程登录会话和其他网络服务提供安全性的协议,可以有效防止远程管理过程中的信息泄露问题。)

在 Ubuntu 终端中,你可以使用以下命令行在 SSH 协议下访问远程服务器:

$ ssh user@host $ ssh -p port host

采用 key 连接:

$ ssh -i key.pem user@host

远程主机执行的命令行:

$ ssh -i key.pem user@host 'command'

SSH Client 已经默认安装在 Ubuntu 中;如果没有的话,可以在终端使用以下命令行安装:

command sudo apt-get install ssh

在 Windows 中

如果你使用的是微软的 Windows 系统,那么你需要安装一个免费的 PuTTY 程序(地址:http://www.putty.org/)以保证 SSH 协议正常运行。为了使用 PuTTY 连接,我们需要经过以下几个步骤:

1. 运行 PuTTY 并键入我们的连接设置:

  • 主机名:example.com
  • 端口:22 (保留默认设定)
  • 连接类型:SSH(保留默认设定)

2. 点击 Open 开始 SSH 会话框。

3. 一旦 SSH 连接已经打开,我们就会看到终端提示符会请求输入用户名。

4. 下一步,输入我们的密码。注意,当我们输入密码时,我们并不会看到任何光标移动或任何输入符号(如:*******)。这是 PuTTY 标准安全的特性,请放心继续输入。

5. 现在我们可以开始输入命令提示符了。

SSH 的重要特征就是能创建安全通道。

在 Ubuntu 中

1. 网络到世界的通道:

ssh -f -N -R 22:192.168.0.1:22 username@1.1.1.1

在主机 1.1.1.1 上输入:访问主机 192.168.0.1

$ ssh localhost

设置:

  • R:执行远程重定向(redirection)。当我们访问远程机器端口时,将会创建一个 SSH 通道(SSH-tunnel),并且连接将转向特定的主机端口。
  • N:禁止远程运行命令行。只有转发端口时才起作用。
  • f:在远程系统注册之后立即转入后台模式。

使用 SSH 通道非常有效的方式是使用通信加密(traffic encryption)。例如,如果我们使用的是开放网络,但并不希望其他人拦截我们的数据就可使用 SSH 通道。

2. 世界到网络的通道:

ssh -f -N -L 80:192.168.0.1:80 username@1.1.1.1

在你的主机输入命令行:http://localhost:80

访问网络主机 192.168.0.1,其位于主机 1.1.1.1 的后面。

设置:

  • L:执行一个本地端口转发。当我们访问本地机器的端口时,特定主机的主机端口将会在通道端口上创建。

从世界到网络的通道(反向通道)在我们需要访问机器,但机器又被防火墙保护时需要。操作的原则即连接最开始是由远程机器发起。在这样的通道中,我们可以发送任何通信(traffic),而并不仅仅只是 SSH。

在 PuTTY 中使用 SSH 通道

  • In Connection -> SSH -> Tunnels, enter

源端口:22

目标端口:22

  • 检查 box 处于「Dynamic」状态,并单击「Add」按钮。
  • 在会话框中输入要求的「Host Name」并选择 SSH 协议。然后键入「Saved Sessions」名保存设置。例如,键入「HostName with ssh tunnel on 22」并点击「Save」。双击主机名将创建连接。
  • 一旦 SSH 连接已经创建了,我们就可以使用浏览器了。打开一个页面,其中 IP 地址是已经确定的,现在我们就能看到地址定义为了远程机器的 IP 地址。

现在已经连接了主机,我们也就可以操作它了。但还是有一些操作需要 root 权限。为了接收到远程主机的信息(如果主机的 root 权限已经设置为允许),我们需要在终端中执行:

$ sudo -s

在输入 root-user 密码后,远程主机的连接也就通过终端确定了。你将会得到 root 权限:

我们现在已经了解了连接到一台主机所需要的一切,但这对于在主机上分析数据还是远远不够的。因此,下面我们需要了解在远程主机上获取和处理数据的基本控制命令行。

在文件系统上工作

现在让我们学一学如何在文件系统上处理数据。下面是所需要了解的命令行列表。

1. 在文件和文件夹系统工作

创建一个文件夹 dir_name:

mkdir dir_name

重命名文件夹 dir_name 为 dir_name2:

mv dir_name dir_name2

删除文件夹/文件:

rm -rf dir_name

设置:

  • -r,-R:处理所有内嵌子目录。
  • -i:显示每一次处理变动的确认(confirmation)。
  • -f:如果错误由不存在的文件引起,不返回错误(false end);处理不需要确认。

移除所有以 file2017 为开头的文件;符号*指代任意字符,我们可以将该符号用在任何地方指代任何缺失的字符:

rm -rf file2017*

创建文件 file_name.txt:

touch file_name.txt

重命名文件:

mv file_name.txt file_name2.txt

2. 权限

  • ls -la:查看目录下所有文件/文件夹的权限和所有权
  • -l:key 扩展输出

执行文件 file 的权限:

chmod 777 file.sh

在文件夹 dir_name 中设定所有文件为 R:

chmod -R 777 dir_name - set access 777 recursively

查看更多请点击: https://ru.wikipedia.org/wiki/Chmod。

3. 所有者/群组

设置文件 file.txt 的所有者和群组:

chown ubuntu:ubuntu file.txt

递归地设置文件夹的所有者和群组:

chown -R ubuntu:ubuntu dir_name

4. 查看磁盘空间

查看所有磁盘分区:

df -h

获取文件夹大小:

du -sh dir_name/

获取文件夹大小和子目录大小:

du -h dir_name/*

获得文件大小:

du -h filename

下面的命令行能获取主机系统的信息:

  • 查看可用随机存储器(RAM)和交换空间(swap)

free

  • 控制台命令行,其显示当前系统进程与信息的列表

top/htop

现在我们已经在文件系统上运行并获取了我们需要的信息。不过在大多数情况下,这些并不是人类可读的信息。因此我们需要一些工具帮助分析数据。

当我们需要分析信息,首先就需要找到它,通常使用命令行:

find / var -name search _name

如果名字太长或未知,同样可以使用符号*。在该案例中,使用命令行:

find / var -name search_name*

我们可以在主机中查找认证日志:

一旦我们搜到了所需的文件,通常打开查看是有必要的。我们可以使用以下命令行实现:

  • 文件输出目录

cat file_name

  • file_name1 和 file_name2 合并为 file_name3

cat file_name1 file_name2 > file_name3

  • 从 file_name 开始合并多个文件

cat file_name* > file_name_end

我们不仅同样可以为文件重定向(redirect)输出流,同时还能采用命令行用脚本完成:

  • 重定向输出到复写文件

./some_script.sh > /path/to/file.txt

  • 重定向输出到添加文件中

./some_script.sh >> /path/to/file.txt

在 /dev/null 中输出标准输出(STDOUT)和误差流(STDERR)

some command > /dev/null 2>&1

下一步是保存文件目录

/var/log/auth.log

/var/log/auth.log.1

/home/auth.log

文件中进行更多的分析。

我们可以从输出看到,有太多的信息我们并不需要。现在我们需要过滤获得正好需要的信息,而该任务有一个很有用的 grep,句法展示为如下:

  • 修剪 cat 的输出以得到只有行的文件 some_line。

cat file_name | grep some_line

Grep 同样能应用于命令行和脚本:

  • 输出只包含误差的字符串

python run_sum_script.py | grep error

通过 sshd 滤波器,我们可以打印仅仅和 ssh 相关的授权记录:

我们同样能追踪文件的修订。当我们测试一个网页时,该方法是十分有效的。所以当查询日志或查看新的授权记录时,我们能「抓取」它。

该命令行将打印第三方应用的新纪录到文件中。

tail -f some_web_server_log

该命令同样能连同 grep 一起使用。

打印包含误差的新纪录

tail -f some_web_server_log | grep error

让我们在操作中查看一下 tail。首先,设置追踪文件

/var/log/auth.log

并使用命令行 tail

-f /var/log/auth.log | grep sshd

在每一个新连接都通过 ssh 连接到主机后,我们将显示信息和授权记录。

另一个高效的文件文本分析工具是 Awk。在该工具的帮助下,我们能轻易地处理任何文本文件格式。Awk 是一种文本语境搜索工具。现有一些方式运行 Awk 程序。如果程序非常短,那么就很容易将其包含在命令行中来运行 Awk。就如同:

awk 'program' input-file1 input-file2

若需要更多的信息,请阅读以下指南:http://www.gnu.org/software/gawk/manual/gawk.html

我们能使用 Awk 查看什么时候用户使用命令行通过 ssh 取得了连接。

$ awk '/sshd/ && /pam_unix/ {print ($1,$2,$3,$8,$11)}' /var/log/auth.log

同样还有一个高效的命令 sed。该命令复制文件(默认标准输入)到标准输出,并通过放置在 script(批处理文件或行编辑器 [而不是 shell])中的命令编辑它们。在 flag -f 命令下,采取图像 sfilefile。如果这里只有一个设置 -e script,那么-e flag 就能够省去。Script 由编辑命令组成,一行一条,并以如下格式:

[addr [, addr]] cmd [args]

「Sed」循环地转变一个输入字符串为输出。

例如:

  • 将 report.txt 文件中每一个 John 替换为 Nick。

sed 's/Nick/John/g' report.txt

  • 移除搜索到的行

who | sed '2,4d'

  • 等等

考虑一些有用的命令行帮助远程主机的操作。Tar 和 zip 文档常常用于保存空间和流量(traffic)。下面的命令行都是用来处理这些的:

对于 tar:

  • 在压缩时忽略示值误差(reading errors)。

tar czf new-tar-file-name.tar.gz file-or-folder-to-archive --ignore-failed-read

  • c:创建新的存档。
  • z:使用 gzip 压缩一个文档。
  • f:使用文档文件。
  • 对于多目录

tar -czf new-tar-file-name.tar.gz file1 file2 folder1 folder2 tar -xzf tar-file-name.tar.gz

  • x:抽取一个文档
  • z:使用 gzip 解压缩一个文档
  • f:使用文档文件

对于 zip:

  • 压缩文件

zip file-or-folder-to-archive new-zip-file-name.zip

  • 解压缩文件

unzip -d new-zip-file-name.zip

其中-d destination_folder

当然,在远程主机上工作不能在没有文件转移(在本地计算机和远程主机间)的情况下完成。为了完成这个,我们能使用以下命令:

  • 下载 tar(从本地机器粘贴)

scp -r (recursive) username@server:(remote location) (local location

  • 上传文件到远程服务器中

scp -r (local location) username@server:(remote location)

上文中我们借助 awk 命令的帮助通过 ssh 已经接受到了连接与非连接用户的时间。现在我们可以将其全部保存到文件中,并压缩为 tar 文件上传。

结语

在这篇文章中我们想要展示命令行接口(CLI)的多种可能性以及其如何能在数据科学上对我们有所帮助。你肯定在命令行上花了很多时间,本文旨在帮助你理解工作中使用的基本命令。

每个工具都有其用武之地,其与更大流程的结合之也会变得越发强大。现在我们有很好的了解运用 grep、sed 和 awk 等优秀的工具。在利用 SSH 协议的安全通道之后,这些工具变得越发重要,我们也希望各位读者能高效地利用它们处理数据。

原文发布于微信公众号 - 机器之心(almosthuman2014)

原文发表时间:2017-05-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我的技术专栏

【翻译】XV6-DRAFT as of September 3,2014 第0章 操作系统接口

1266
来自专栏程序员互动联盟

怎样快速调试linux内核?有哪些需要注意的问题?

这个问题就比较专业了,linux内核调试还是在调试内核驱动的时候用过,涉及的程度不是特别深,但是可以说下大致的思路,linux虽然贵为操作系统,但是归根到底还是...

1113
来自专栏后端技术探索

爬虫、代理和Nginx

做过爬虫的人应该都知道,抓的网站和数据多了,如果爬虫抓取速度过快,免不了触发网站的防爬机制,几乎用的同一招就是封IP。解决方案有2个:

2862
来自专栏我的博客

虚拟机配置端口映射

今天打算建立一个公共的虚拟服务器,班级内所有同学可以使用用ssh连接,共享文件。然后可以通过web方式下载共享的文件。配置方法如下: 先安装虚拟机(可以查看我博...

3426
来自专栏姚姝娜的专栏

关于 Git 的那些事

本篇文章主要讲了下 Git 的一些基本的概念以及如果使用 git log 的命令来进行一段时间段的代码量统计,其中还可以统计不同作者修改的代码量,其中关于 gi...

4771
来自专栏鸿的学习笔记

不一样的日志

这里提的日志并不是应用程序产生的日志,应用程序产生的日志是以一种人类读得懂的方式展示程序运行信息的记录方式,本身不包含任何数据,这篇文章所要描述的日志指的数据系...

1075
来自专栏架构师之路

“id串行化”到底是怎么实现的?

一、需求缘起 在上一篇文章《消息“时序”与“一致性”为何这么难?》中,介绍了一种为了保证“所有群友展示的群消息时序都是一致的”所使用的“id串行化”的方法:让同...

4248
来自专栏GopherCoder

『Ansible 上手指南』

1823
来自专栏JAVA同学会

JAVA9模块化详解(一)——模块化的定义

java9已经出来有一段时间了,今天向大家介绍一下java9的一个重要特性——模块化。模块化系统的主要目的如下:

1022
来自专栏米扑专栏

Linux crond 不执行原因分析

53211

扫码关注云+社区

领取腾讯云代金券