熟练操作命令行是一项经常被我们忽视的技能,或者我们认为它太神秘了。不过,作为一名软件工程师,掌握这项技能可以大大提高我们的工作灵活性,提高工作效率。这篇文章是我在处理 Linux 时学到的一些技巧的总结。有些非常基础,有些则相当专业,不容易理解。这篇文章并不长,但是如果你能在工作中充分利用这里介绍的技巧,你会学到很多东西。
这里的很多内容最初出现在Quora(《》)上,但考虑到Github用户的性质,他们比我更有才华,总能提出改进建议,所以使用Github更合适。如果您发现本文有错误或者有需要改进的地方,请果断提交Issue或者Pull Request! (当然,请在提交之前阅读必读部分和现有的 PR/问题)。
必读
编者注:为了控制篇幅,部分内容加了引号。您还可以通过google等工具搜索详细信息。使用 apt-get/yum/dnf/pacman/pip/brew 等命令安装新程序。
使用Explainshell 获取有关命令、选项、管道等的帮助。
根据
学习基本的 bash 用法,具体来说,阅读 bash 手册页(man bash and read it through);这很容易而且不长。其他shell也可以,但bash是最通用的(如果你只学习zsh、fish等,在你自己的工作环境中也许能顺利使用,但当你改变场景时就会停止,比如在服务器上运行)。
至少学习一种文本编辑器。最好的是 vim (vi)。在终端中随机编辑文档方面,其他编辑器无法与之竞争(即使大多数时候您使用其他一些大型IDE,例如Emacs,或其他一些流行的编辑器)。如果您是 Vim 新手,建议阅读《Vim 入门教程》2/、《25 个 Vim 教程、视频和资源》。
知道如何通过man来阅读文档(很好奇的人可能只是用man来列出不同的章节号,比如:1代表普通shell命令,5代表文件格式和规范,8代表系统管理命令等)。学习使用 apropos 查找 man 手册。要知道有些命令不是可执行文件,而是bash内置的。对于此类命令,可以使用help或help -d来获取帮助(例如cd)。
学习使用 > 和 < 来重定向输入和输出,并学习使用 |创建管道。了解>用于覆盖输出文件,>>用户追加到输出文件。了解标准输出 stdout 和标准错误 stderr。
了解文件通配符 *(可能还有 ? 和 {…})和引号,并了解双引号和单引号之间的区别。 (详细信息请参见下面的变量扩展)
精通bash的任务管理器:&、ctrl-z、ctrl-c、jobs、fg、bg、kill等。
熟悉ssh,知道如何通过ssh-agent、ssh-add等实现无密码认证。
基本文件管理命令: ls 和 ls -l (特别是要知道 ls -l 结果中每一列的含义)、less、head、tail 和 tail -f (最好也知道 less +F 是什么意思)是意思)、ln和ln -s(了解硬链接和软链接的区别、优缺点)、chown、chmod、du(磁盘使用情况:du -hk *)。对于文件系统,df、mount、fdisk、mkfs、lsblk。
基本网络管理命令:ip或ifconfig、dig。
精通正则表达式和grep/egrep工具的各种标志。有必要了解-i、-o、-A 和-B 选项的含义。
学习使用 apt-get、dnf 或 pacman(取决于发行版)来查找或安装软件包。确保你已经安装了pip来安装python相关的命令行工具。 (下面介绍的工具可以使用pip安装)
日常使用
在 Bash 中,使用 Tab 键完成命令,使用 ctrl-r 查询历史命令。
在 Bash 中,使用 ctrl-w 删除前一个单词,使用 ctrl-u 删除整行命令。使用alt-b和alt-f逐字向前和向后跳转,ctrl-k删除从鼠标位置到行尾的所有字符,ctrl-l清除屏幕。有关 Bash 中的默认组合键,请参阅 man readline 中的“按键绑定”部分。还有很多其他的,比如alt-。可用于向上滚动到以前的命令,alt-* 扩展到当前目录中的所有文件。
如果您喜欢 vi 风格的组合键,可以设置 -o vi。
使用history命令可以查看最近执行过的命令。还有很多其他的缩写命令,比如!$表示前面的参数,!!执行上一个命令等。但通常我们使用ctrl-r和alt-。更常见。
返回上一个工作目录:cd -
如果你在输入命令的过程中发现还有其他事情没有完成,想稍后再执行,该怎么办?使用 alt-# 在此命令行的开头添加 #,然后按 Enter 作为注释(或使用 ctrl-a、#,然后按 Enter)。然后通过history命令找到并继续输入。
Xargs 或并行命令也可以很好地工作。我们还可以使用 -L 或 -P 选项限制每行参数的数量。如果不确定执行结果,可以先使用 xargs echo 检查一下。同样,-I{} 选项也很容易使用。例如:
寻找 。 -名称 '*.py' | xargs grep some_function
猫主机| xargs -I{} ssh root@{} 主机名
[补充:找到 . -名称“.dsc”| xargs -L 2 echo 可以列出当前目录下的所有.dsc 文件,并限制每行显示两项。
寻找 。 -名称“.dsc” | xargs -I{} mv {} {}.bak 可以将当前目录下所有后缀为.dsc的文件重命名为.dsc.bak
-I 选项告诉 xargs 将 {}] 替换为每个项目的名称
pstree -p 可以清晰地显示进程树。
使用 pgrep 和 pkill 按名称查找进程或向进程发送信号(注意 -f 的使用)
了解发送到进程的一些信号。例如,您可以使用kill -STOP [pid] 来停止进程。 Man 7 信号 查看完整列表。
使用 nohup 或 disown 命令使程序保持在后台运行。
使用netstat -lntp或ss -plat命令查看哪些进程正在监听该端口(默认监听TCP端口,使用-u监听UDP)。
使用 lsof 查看所有打开的套接字和文件。来自男子的详细信息
使用alias为常用命令创建别名。例如,alias ll='ls -latr' 为我们创建一个新的别名 ll。
在 Bash 脚本中,使用 set -x 来调试输出。尽可能使用严格模式。如果我们想阻止我们的程序即使出现错误也不能继续运行,我们可以通过设置set -e来限制。还可以使用set -o pipelinefail来严格限制错误(这种问题比较微妙,需要更多的理解)。对于更复杂、更复杂的脚本,可以使用 trap。
在 Bash 脚本中,子 shell(用括号括起来)可用于方便地组织命令。常见的用法是暂时切换到不同的工作目录,例如:
# 在当前目录下工作
(cd /some/other/dir && 其他命令)
# 继续在原来的目录下工作
请注意,Bash 中有多种扩展变量的方法。
检查变量是否存在:${name:?error message}。例如:如果 Bash 脚本需要参数,则 input_file=${1:?usage: $0 input_file} 即可。
数学展开:i=$(((i+1)%5))
序列:{1..10}
截断字符串:${var%suffix} 和 ${var#prefix},例如 var=foo.pdf,命令 echo ${var%.pdf}.txt 打印 foo.txt。
经过; ::任何 NFC; ' < 输入.txt > 输出.txt
要分割文件,请查看 split (按大小分割)和 csplit (按模式分割)。
使用 zless、zmore、zcat 和 zgrep 对压缩文件进行操作。
系统调试
对于web调试来说,curl和curl -I都是非常好用的工具,它们的好朋友wget也不错,或者说比较时尚的httpie。
使用iostat、netstat、top(htop更好)和dstat获取硬盘、cpu和网络的状态。熟练使用这些工具可以让您快速概览系统当前的状态。
要深入了解系统,请使用概览。它在终端窗口中为您提供一些系统级数据。这对于快速检查各个子系统非常有帮助。
要了解内存状态,请运行并了解 free 和 vmstat 的输出。特别注意“cached”的值,它是指Linux内核用作文件缓存的内存大小,因此与空闲内存无关。
调试 Java 系统是另一回事,但有一个简单的技巧可以与 Oracle 的 JVM 或其他 JVM 一起使用。运行kill -3
完整的堆栈跟踪和堆概述(包括 GC 详细信息)将保存到标准输出/日志文件中。
使用 mtr 跟踪路由并识别网络问题。
使用 ncdu 检查磁盘使用情况。它比常用命令(例如 du -sh *)节省时间。
要查找正在使用带宽的套接字连接或进程,请使用 iftop 或 nethogs。
ab 工具(与 Apache 捆绑在一起)提供了一种简单粗暴的方法来检查 Web 服务器的性能。对于更复杂的负载测试,请使用 siege。
wireshark、tshark 和 ngrep 可用于复杂的网络调试。
了解 strace 和 ltrace。当您想了解程序失败、挂起甚至崩溃的原因,或者想全面了解性能时,这两个工具非常有用。请注意配置文件参数 (-c) 和附加到正在运行的进程的参数 (-p)。
了解用于检查共享库等的 ldd 命令。
了解如何使用 gdb 调试正在运行的程序并获取堆栈跟踪。
学习使用/proc。在调试持续存在的问题时,它有时会出奇地有效。例如:/proc/cpuinfo、/proc/meminfo、/proc/cmdline、/proc/xxx/cwd、/proc/xxx/exe、/proc/xxx/fd/、/proc/xxx/smaps。
如果你想调试一个已经发生的问题,sar就非常有用。它列出了CPU、内存、网络等的历史统计数据。
要进行更深入的系统分析和性能分析,请查看 stap (SystemTap)、perf 和 sysdig。
要检查当前使用的系统,请使用 uname 或 uname -a (Unix/内核信息)或 lsb_release -a (Linux 版本信息)。
如果有些事情看起来有点奇怪,请尝试查看 dmesg 消息(可能是硬件或驱动程序问题)。
一行命令
一些组合命令:
当需要对文本文件执行集合交集、并集和差集操作时,sort/uniq 的组合非常有用。假设a和b是两个内容不同且去重不同的文件。这种方法非常高效,适用于各种大小的文件,无论是小文件还是千兆字节大小的大文件。 (sort 不受内存限制,但如果 /tmp 位于容量有限的根分区上,则可能需要 -T 参数。)请参阅上一节有关 LC_ALL 和 sort 的 -u 参数的内容。
猫 ab |排序|优衣库 > c
# c 是并集 b
猫 ab |排序| uniq -d > c
# c 是 b 的交集
猫 abb |排序| uniq -u > c
# c 是设定差值 a - b
使用 grep 。 * 命令检查目录中所有文件的内容,例如包含许多配置设置的文件:/sys/、/proc/、/etc。
计算文本文件中第三列数据的总和(比python快三倍,但代码量只有python的1/3):
awk '{ x += $3 } END { print x }' myfile
如果要查看目录树中文件的大小或日期,以下命令类似于递归 ls -l,但输出比 ls -lR 更具可读性:
寻找 。 -类型 f -ls
Xargs 或并行命令也可以很好地工作。我们还可以使用 -L 或 -P 选项限制每行参数的数量。如果不确定执行结果,可以先使用 xargs echo 检查一下。同样,-I{} 选项也很容易使用。例如:【之前已经提到过,内容重复】
寻找 。 -名称 '*.py' | xargs grep some_function
猫主机| xargs -I{} ssh root@{} 主机名
假设您有一个类似于 Web 服务器日志文件的文本文件,并且某个值仅出现在某些行上,例如出现在 URL 中的 acct_id 参数。如果要统计每个 acct_id 值的请求数,请使用以下代码:
运行此函数可从此文档中获取随机提示(解析 Markdown 文件并提取项目):
函数 taocl() {
卷曲 -s |
pandoc -f markdown -t html | pandoc -f markdown -t html | pandoc -f markdown -t html | pandoc -f markdown -t html | pandoc
xmlstarlet fo --html --dropdtd | xmlstarlet fo --html --dropdtd |
xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" |
xmlstarlet 联合国教科文组织 | FMT -80
一个有效的小技巧
expr:计算表达式、布尔运算或正则匹配
m4:简单宏处理器
yes: 多次打印字符串
cal:日历
env:执行命令(在脚本文件中有用)
printenv:打印环境变量(在调试或编写脚本时非常有用)
Look:查找以某个字符串(或文件中的某行)开头的英文单词
剪切、粘贴和连接:数据处理
fmt:格式化文本段落
pr:将文本格式化为页数据或列数据
Fold:封装文本中的行【例如-w指定宽度,不使用默认的80】
列:将文本格式化为列或表数据
展开和取消展开:在制表符和空格之间转换
nl:添加行号
seq:打印序列号
BC:计算器
Factor:分解因子[例如因子100,输出2 2 5 5]
gpg:加密和签名文件
toe:端子类型列表
nc:网络调试和数据传输
socat:socket代理,类似于netcat
slurm:网络负载监视器
dd:在文件或设备之间传输数据
file:确定文件类型
tree:以树的形式显示路径和文件,类似于ls,但该命令会递归显示
stat:文件信息
time:执行命令并计算执行时间
tac:反向输出文件
Shuf:随机选择并排列文件中的数据
comm:逐行比较排序的文件
pv:监控通过管道的数据
hd 和 bvi:保存或编辑二进制文件
strings:提取二进制文件的文本内容
Tr:字符转换与处理
iconv 或 uconv:文本编码转换
Spit 和 scplit:分割文件
Sponge:在写入之前读取所有输入,在读写同一个文件时非常有用,例如:grep -v some-file | grep -v some-file | sponge Sponge some-file [删除与文件中某些内容匹配的所有行]
单位:单位换算及计算;将一种测量单位转换为另一种等效测量单位(请参阅 /usr/share/units/definitions.units)
7z:高效的压缩工具
ldd:查看动态库信息
Nm:从可执行文件或obj文件中提取符号
Ab:Web服务器性能分析工具
Strace:调试系统调用
Mtr:网络调试和跟踪工具
Cssh:可视化并发 shell
rsync:可用于远程文件目录同步
Wireshark 和 tshark:数据包捕获和网络调试
Ngrep:网络层的grep工具
托管和挖掘:DNS 查找
lsof:进程文件描述符和套接字信息【列出所有打开的文件】
dstat:通用系统统计工具
概览:多个子系统的高级概述
iostat:CPU和硬盘使用状态
htop:top的增强版
最后:登录历史记录
w:当前登录的用户
id:用户/组ID信息
sar:系统历史数据统计
iftop 或 nethogs:套接字和进程的网络利用率
ss:socket数据统计
dmesg:启动和系统错误消息
hdparm:SATA/ATA磁盘操作和性能分析
lsb_release:Linux发行版信息
lsblk:列出块设备信息:显示磁盘和磁盘分区信息的树视图
lshw、lscpu、lspci、lsusb 和 dmidecode:查看硬件信息,包括 CPU、BIOS、RAID、显卡、其他设备等。
Fortune, ddate 和 sl: 开个玩笑...如果你对心灵鸡汤或者跑火车感兴趣的话可以自己尝试一下
仅限 MacOS
以下提示仅适用于 MacOS 系统
请注意,MacOS系统是基于BSD UNIX的。许多命令(如 ps、ls、tail、awk、sed)与 Linux 中的命令略有不同,并且很大程度上受到 System V 风格的 Unix 和 GNU 工具的影响。您可以在标题为“BSD General Commands Manual”的手册页中找到这些差异。在某些情况下,还可以安装GNU 版本的命令(例如gawk 和gsed 对应于GNU 中的awk 和sed)。如果要编写跨平台 Bash 脚本,请避免使用这些命令(例如,考虑 Python 或 perl)或仔细测试它们。
本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.fwsgw.com/a/xinling/209402.html