当前位置: 首页 > 科技观察

加薪,首先要有效率,Linuxshell的12个妙招,让你运维高效_0

时间:2023-03-20 01:37:27 科技观察

对于管理员或者用户来说,命令行不仅是一个可以完成所有任务的工具,更是一个高度可定制的工具,可以永远开发的工具。最近,有一篇关于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默认情况下每2秒执行一次并预先清除屏幕,直到按下Ctrl+C。您可以配置执行频率。当您想观看实时日志时,此功能很有用。8.bash命令创建作用域非常有用。例如,您可以这样写:forsrvin12345;doecho"server${srv}";doneserver1server2server3server4server5而不是这样:forsrvinserver{1..5};doecho"$srv";doneserver1server2server3server4server5您还可以使用seq命令来生成格式化范围。例如,我们可以使用seq创建将根据宽度(00、01而不是0、1)自动调整tic的值:forsrvin$(seq-w510);doecho"server${srv}";doneserver05server06server07server08server09server10another使用命令替换示例-重命名文件。要获取不带扩展名的文件名,我们使用“basename”命令:forfilein*.txt;doname=$(basename"$file".txt);mv$name{.txt,.lst};done甚至比'%'更短:forfilein*.txt;domv${file%.txt}{.txt,.lst};donePS实际上,对于重命名文件,您可以尝试具有许多选项的重命名工具。另一个例子-让我们为新的java项目创建结构:mkdir-pproject/src/{main,test}/{java,resources}结果9.tail,多个文件,多个用户...我已经提到multitail来读取文件和观看多个实时日志。但是默认情况下该功能不可用,并且安装某些东西的权限并不总是可用。但标准tail也可以做到这一点:tail-f/var/logs/*.log还可以让您记住有关使用“tail-f”别名查看应用程序日志的用户的信息。多个用户可以使用“tail-f”同时查看日志文件。他们中的一些人不是很健谈。出于某种原因,他们可能在后台留下了“tail-f”而忘记了。有一些正在运行的“tail-f”进程正在监视一个不存在的日志文件,如果应用程序重新启动,该文件可能会挂起数天甚至数月。通常这不是一个大问题,但不是很好。如果使用别名查看日志,可以通过--pid选项修改这个别名:aliasTFapplog='tail-f--pid=$(cat/opt/app/tmp/app.pid)/opt/app/logs/app.log'在这种情况下,当目标应用程序重新启动时,所有尾部将自动终止。10.创建指定大小的文件dd是处理块和二进制数据最流行的工具之一。例如,创建一个1MB的文件并用零填充它是:ddif=/dev/zeroof=out.txtbs=1Mcount=10但我建议在支持的分配函数(xfs、ext4、Btrfs...),fallocate将立即执行,这与dd工具不同。此外,分配指的是实际分配块,而不是创建备用文件。11.xargs很多人都知道流行的xargs命令。但并不是所有的都使用以下两个选项,因此脚本可以大大改进。首先-您可以获得非常长的参数列表,并且可能超过命令行长度(默认情况下约为4kb)。但是您可以使用-n选项限制执行,因此xargs将多次运行该命令,一次发送指定数量的参数:处理长列表可能会花费很多时间,因为它在单个线程中运行。但是,如果我们有多个内核,我们可以告诉xargs并行运行:echo12345678910|xargs-n2-P3echo在上面的例子中,我们告诉xargs在3个线程中处理列表;每个线程将接受并处理2个参数。如果不知道自己有多少核,用“nproc”优化:echo12345678910|xargs-n2-P$(nproc)echo12.sleep?尽管?读!有时您需要等待几秒钟。或者等待用户输入:read-p"Pressanykeytocontinue"-n1但你可以只添加超时选项来读取命令,脚本将暂停指定的秒数,但在交互式执行的情况下,用户可以轻松跳过等待。read-p"Pressanykeytocontinue(autocontinuein30seconds)"-t30-n1所以你只是忘了睡眠命令。我怀疑不是所有的噱头看起来都很有趣,但在我看来,有十二个数字是很好的数字。