Linux shell的12个巧妙攻略让你运维高效

1.使用可变扩展名分割字符串

人们经常使用cut甚至awk只是通过模式或使用分隔符减去字符串的一部分。

另外,许多人使用$ {VARIABLE:start_position:length}进行子字符串bash操作,这非常快。

但是bash提供了一种使用#,##,%和%%来处理文本字符串的强大方法-它称为bash变量扩展。

使用此语法,您可以在无需执行外部命令的情况下减少模式的需要,因此它将非常快速地工作。

下面的示例显示了如何使用cut或变量扩展从字符串中获取第三列(shell),其中用冒号«username:homedir:shell»分隔的值(我们使用*: mask和##命令,这意味着:将所有字符向左剪切,直到找到最后一个冒号为止):


  1. $ STRING="username:homedir:shell" 
  2. $ echo "$STRING"|cut -d ":" -f 3 
  3. shell 
  4. $ echo "${STRING##*:}" 
  5. shell 

第二个选项不启动子进程(cut),并且根本不使用管道,这样可以更快地工作。而且,如果您在管道几乎不移动的Windows上使用bash子系统,则速度差异会很大

让我们看一下Ubuntu上的示例:循环执行我们的命令1000次


  1. $ cat test.sh 
  2. #!/usr/bin/env bash 
  3. STRING="Name:Date:Shell" 
  4. echo "using cut" 
  5. time for A in {1..1000} 
  6. do 
  7.  cut -d ":" -f 3 > /dev/null <<<"$STRING" 
  8. done 
  9. echo "using ##" 
  10. time for A in {1..1000} 
  11. do 
  12.  echo "${STRING##*:}" > /dev/null 
  13. done 

结果


  1. $ ./test.sh 
  2. using cut 
  3. real 0m0.950s 
  4. user 0m0.012s 
  5. sys 0m0.232s 
  6. using ## 
  7. real 0m0.011s 
  8. user 0m0.008s 
  9. sys 0m0.004s 

差别是几十倍!

当然,上面的例子太人为了。在实际示例中,我们将不使用静态字符串,而是要读取真实文件。对于“ cut ”命令,我们只将/etc /passwd重定向到它。在##的情况下,我们必须创建一个循环并使用内部的' read '命令读取文件。那么谁将赢得这场案子呢?


  1. $ cat test.sh 
  2. #!/usr/bin/env bash 
  3. echo "using cut" 
  4. time for count in {1..1000} 
  5. do 
  6.  cut -d ":" -f 7 </etc/passwd > /dev/null 
  7. done 
  8. echo "using ##" 
  9. time for count in {1..1000} 
  10. do 
  11.  while read 
  12.  do 
  13.  echo "${REPLY##*:}" > /dev/null 
  14.  done </etc/passwd 
  15. done 

结果

还有两个示例:

在等号后提取值:


  1. $ VAR="myClassName = helloClass" 
  2. $ echo ${VAR##*= } 
  3. helloClass 

提取括号中的文本:


  1. $ VAR="Hello my friend (enemy)" 
  2. TEMP="${VAR##*\(}" 
  3. $ echo "${TEMP%\)}" 
  4. enemy 

2. Bash自动补全

bash-completion软件包几乎是每个Linux发行版的一部分。您可以在/etc/bash.bashrc或/etc/profile.d/bash_completion.sh中启用它,但是通常默认情况下已启用它。通常,自动完成是新手首先遇到的Linux Shell上的第一个便捷时刻。

但是并非所有人都使用所有bash补全功能这一事实,在我看来完全是徒劳的。例如,不是所有人都知道,自动完成功能不仅适用于文件名,而且适用于别名,变量名,函数名,甚至适用于某些带有参数的命令。如果您深入研究自动完成脚本(实际上是shell脚本),甚至可以为自己的应用程序或脚本添加自动完成。

但是,让我们回到别名。

您无需编辑PATH变量或在指定目录中创建文件即可运行别名。您只需要将它们添加到配置文件或启动脚本中,然后在任何位置执行它们即可。

通常,我们在* nix中使用小写字母表示文件和目录,因此创建大写别名非常方便-在这种情况下,bash-completion 几乎会用单个字母来猜测您的命令:


  1. $ alias TAsteriskLog="tail -f /var/log/asteriks.log" 
  2. $ alias TMailLog="tail -f /var/log/mail.log" 
  3. $ TA[tab]steriksLog 
  4. $ TM[tab]ailLog 

3.使用选项卡进行Bash自动补全-第2部分

对于更复杂的情况,可能您想将个人脚本放入$ HOME / bin。

但是我们在bash中有功能。

函数不需要路径或单独的文件。(注意)bash补全也可以与函数一起使用。

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章