对于管理员或者用户来说,命令行不仅是一个可以完成所有任务的工具,更是一个高度可定制的工具,可以永远开发的工具。最近,有一篇关于CLI中一些有用技巧的翻译文章。但我觉得翻译人员没有足够的CLI经验,也没有遵循所描述的技巧,所以很多重要的事情可能会被遗漏或误解。从个人经验来看,Linuxshell中有12个技巧。注意:本文中的所有脚本和示例都已尽可能简化,因此您可能会发现一些看起来完全没用的技巧-也许这就是原因。但无论如何,请在评论中分享您的想法!1.使用可变扩展名拆分字符串人们经常使用cut甚至awk来通过模式或使用定界符减去部分字符串。此外,许多人使用${VARIABLE:start_position:length}进行子字符串bash操作,速度非常快。但是bash提供了一种使用#、##、%和%%来处理文字字符串的强大方法——这称为bash变量扩展。使用此语法,您无需执行外部命令即可减少对模式的需求,因此工作速度非常快。下面的例子展示了如何使用剪切或变量扩展从一个字符串中获取第三列(shell),其值由冒号分隔?username:homedir:shell?(我们使用*:mask和##命令,这意思是:向左剪切所有字符,直到找到最后一个冒号):$STRING="username:homedir:shell"$echo"$STRING"|cut-d":"-f3shell$echo"${STRING##*:}"shell第二个选项不启动子进程(剪切)并且根本不使用管道,这样工作速度更快。如果您在管道几乎不移动的Windows上使用bash子系统,则速度差异很大。让我们看一个Ubuntu上的例子:循环我们的命令1000次$cattest.sh#!/usr/bin/envbashSTRING="Name:Date:Shell"echo"usingcut"timeforAin{1..1000}docut-d":"-f3>/dev/null<<<"$STRING"doneecho"using##"timeforAin{1..1000}doecho"${STRING##*:}">/dev/nulldoneresult$./test.shusingcutreal0m0.950suser0m0.012ssys0m0.232susing##real0m0.011suser0m0.008ssys0m0.004s相差几十倍!当然,上面的例子太做作了。在实际的例子中,我们不会使用静态字符串,而是读取真实的文件。对于“cut”命令,我们只是将/etc/passwd重定向到它。在##情况下,我们必须创建一个循环并使用内部的“read”命令读取文件。那么谁会胜诉呢?$cattest.sh#!/usr/bin/envbashecho"usingcut"timeforcountin{1..1000}docut-d":"-f7/dev/nulldoneecho"using##"timeforcountin{1..1000}dowhilereaddoecho"${REPLY##*:}">/dev/nulldonesecret.key;chmod600secret.key让我们用aes-256-cbc加密字符串:$echo"string_to_encrypt"|opensslenc-passfile:secret.key-e-aes-256-cbc-aU2FsdGVkX194R0GmFKCL/krYCugS655yLhf8aQyKNcUnBs30AE5lHN5MXPjjSFML文件密钥存储在git或其他任何地方,没有秘密。破译它几乎是不可能的。要解密执行相同的命令,只需将-e替换为-d:$echo'U2FsdGVkX194R0GmFKCL/krYCugS655yLhf8aQyKNcUnBs30AE5lHN5MXPjjSFML'|opensslenc-passfile:secret.key-d-aes-256-cbc-astring_tocommand_encrypt5.grep命令都应该知道。并对正则表达式友好。通常,你可以这样写:tail-fapplication.log|grep-ierror甚至像这样:tail-fapplication.log|grep-i-P"(error|warning|failure)"但不要忘记grep有很多不错的选择。例如-v,它会恢复您的搜索并显示除“info”消息之外的所有消息:tail-fapplication.log|grep-v-i“info”else:选项-P很有用,因为默认情况下,grep使用Prettyoutdated?基本正则表达式:?,和-P启用PCRE,它甚至不知道分组。-我忽略大小写。--line-buffered立即解析行,而不是等待达到标准4k缓冲区(对tail-f|grep有用)。如果您很了解正则表达式,那么使用--only-matching/-o确实可以很好地切割文本。只需比较以下两个命令即可提取myuser的shell:$grepmyuser/etc/passwd|cut-d":"-f7$grep-Po"^myuser(:.*){5}:\K.*"/etc/passwd第二个命令看起来更编译,但它只运行grep而不是grep和cut,因此执行时间会更少。6.如何减小日志文件的大小在*nix中,如果删除一个应用程序当前正在使用的日志文件,不能只删除所有日志,还可以阻止应用程序写入新日志,直到它重新启动.由于文件描述符不是一个打开的文件名而是一个iNode结构,应用程序会继续将文件描述符写入没有目录项的文件,应用程序停止后文件会被文件系统自动删除(你的应用程序你可以通过每次想写东西的时候打开和关闭日志文件来避免这种问题,但是会影响性能)。那么如何清除日志文件而不删除它:echo"">application.log或者我们可以使用truncate命令:truncate--size=1Mapplication.log提到这个truncate命令将删除文件的其余部分,所以你会丢失最近的日志事件。另一个如何存储最后1000行的示例:echo"$(tail-n1000application.log)">application.logPS在Linux中,我们有标准服务rotatelog。您可以将日志记录添加到自动截断/旋转,或使用现有的日志记录库来执行此操作(例如Java中的log4j)。7.观看在某些情况下,您正在等待事件结束。例如,当另一个用户登录到shell(你连续执行who命令)时,或者当有人应该使用scp或ftp将文件复制到你的计算机时,你正在等待完成(重复ls几十次)。在这种情况下,您可以使用watch
