Shell读写能力是程序员应具备的最重要技能之一。 Unix shell是有史以来编写代码最强大的想法之一,对于您来说,它应该是您的第二本性。没有其他工具可以有效地命令您的计算机快速执行复杂的任务,或者将它们存储为以后可以使用的脚本。
在工作流程中,我使用Vim作为编辑器,并使用Unix作为“ IDE”。我不会骗我vimrc来添加许多类似IDE的功能-我每天使用的最重要的插件是Ctrl + P,这使得打开文件更加容易。具备Vim知识是一项宝贵的技能,但重要的细节是知道何时删除它。我的日常工作流程涉及多个openterminal,一个通常与Vim一起使用,另一个用于运行内部版本或守护程序,另一个则可以使Shell方便地处理我可能要问的任何事情。
我保持打开状态的外壳使我能够执行复杂的任务并在工作时回答复杂的问题。我用git grep找到有趣的东西,用sed执行批量查找和替换,用awk回答问题,并使用临时的shell命令和管道按需执行更复杂的任务。我可以自由地创造性地解决问题,而不必受限于IDE设计人员的要求。
这是我最近遇到的一个问题示例:我在git存储库中做了很多更改。我想还原已删除的文件而不删除其余的更改,但是其中有数百个。我如何有效解决这个问题?
好吧,我首先使用git status来了解问题的严重性,它显示了数百个需要还原的已删除文件。这个比例超出了手动干预的实际限制,因此我切换到git status -s以获得更友好的管道输出。
$ git status -s D main / a52dec / APKBUILD D main / a52dec / a52dec-0.7.4-build.patch D main / a52dec / automake.patch D main / a52dec / fix-globals-test-x86-pie.patch D main / aaudit / APKBUILD D main / aaudit / aaudit D main / aaudit / aaudit-common.lua D main / aaudit / aaudit-repo D main / aaudit / aaudit-server.json D main / aaudit / aaudit-server.lua ..
我可以解决这个问题。我添加grep' ^ D'过滤掉所有未被删除的条目,并通过awk' {print $ 2}'仅提取文件名。我经常会运行不完整的管道,只是为了检查工作并抓住方向:
很好-我们已经生成了需要处理的文件列表。请注意,回想起来,我可以删除grep并使用awk达到相同的效果:
但是,我们只是在此处编写一个临时命令来解决特定的临时问题-技巧并不重要。该命令不会进行代码审查。在这些情况下,我通常的想法是一次解决一个问题:“过滤列表”和“重写列表”。无论如何,最后一步是在xargs的帮助下实际使用此文件列表来解决此问题。
$ git status -s | awk' / ^ D / {print $ 2}' | xargs git checkout-
让我们看一些有趣的临时外壳管道的例子。自然地,我写了一个外壳管道来寻找一些:
$历史记录|切-d' ' -f2- | awk -F' |' ' {打印NF-1" " $ 0}' |排序-n |尾巴
切-d' ' -f2-使用空格作为adelimiter从每行中删除第一个字段。历史记录为每个命令编号,这将删除该编号。
awk -F' |' ' {打印NF-1" " $ 0}告诉awk使用|作为每行的字段定界符,并打印以字段数为前缀的每行。这会打印我历史记录的每一行,并以管道操作员在该行中出现的次数为前缀。
此刻编写的命令可以根据命令的复杂性查找,表征,过滤和排序myshell历史记录。这是我发现的几个很酷的shell命令:
我一直在使用此命令。如果以后要观看视频,请触摸该文件,使其显示在此列表的顶部。另一个命令使用netcat将修补版本的Celeste压缩包发送给朋友,减去(大型)游戏资源,并通过pv显示进度:
找 。 ! -path' ./ Content / *' | xargs tar -cv | pv | zstd | nc 204:fbf5:... 12345
顺便说一下,tar是用于通过管道移动多个文件的被低估的工具。它可以读取和写入tarball到stdin和stdout!
我希望这能使您对Unixshell的功能具有诱人的品味。如果您想了解有关shell的更多信息,我可以推荐shellhaters.org作为POSIX规范中与shell相关的各个部分的重要起点。不要担心规格-简洁,全面,易懂且包含很多示例。我也绝对建议您花些时间特别学习awk:这是一个简短的教程。