1.使用可变扩展名分割字符串
人们经常使用cut甚至awk只是通过模式或使用分隔符减去字符串的一部分。
另外,许多人使用$ {VARIABLE:start_position:length}进行子字符串bash操作,这非常快。
但是bash提供了一种使用#,##,%和%%来处理文本字符串的强大方法-它称为bash变量扩展。
使用此语法,您可以在无需执行外部命令的情况下减少模式的需要,因此它将非常快速地工作。
下面的示例显示了如何使用cut或变量扩展从字符串中获取第三列(shell),其中用冒号«username:homedir:shell»分隔的值(我们使用*: mask和##命令,这意味着:将所有字符向左剪切,直到找到最后一个冒号为止):
- $ STRING="username:homedir:shell"
- $ echo "$STRING"|cut -d ":" -f 3
- shell
- $ echo "${STRING##*:}"
- shell
第二个选项不启动子进程(cut),并且根本不使用管道,这样可以更快地工作。而且,如果您在管道几乎不移动的Windows上使用bash子系统,则速度差异会很大。
让我们看一下Ubuntu上的示例:循环执行我们的命令1000次
- $ cat test.sh
- #!/usr/bin/env bash
- STRING="Name:Date:Shell"
- echo "using cut"
- time for A in {1..1000}
- do
- cut -d ":" -f 3 > /dev/null <<<"$STRING"
- done
- echo "using ##"
- time for A in {1..1000}
- do
- echo "${STRING##*:}" > /dev/null
- done
结果
- $ ./test.sh
- using cut
- real 0m0.950s
- user 0m0.012s
- sys 0m0.232s
- using ##
- real 0m0.011s
- user 0m0.008s
- sys 0m0.004s
差别是几十倍!
当然,上面的例子太人为了。在实际示例中,我们将不使用静态字符串,而是要读取真实文件。对于“ cut ”命令,我们只将/etc /passwd重定向到它。在##的情况下,我们必须创建一个循环并使用内部的' read '命令读取文件。那么谁将赢得这场案子呢?
- $ cat test.sh
- #!/usr/bin/env bash
- echo "using cut"
- time for count in {1..1000}
- do
- cut -d ":" -f 7 </etc/passwd > /dev/null
- done
- echo "using ##"
- time for count in {1..1000}
- do
- while read
- do
- echo "${REPLY##*:}" > /dev/null
- done </etc/passwd
- done
结果
还有两个示例:
在等号后提取值:
- $ VAR="myClassName = helloClass"
- $ echo ${VAR##*= }
- helloClass
提取括号中的文本:
- $ VAR="Hello my friend (enemy)"
- $ TEMP="${VAR##*\(}"
- $ echo "${TEMP%\)}"
- enemy
2. Bash自动补全
bash-completion软件包几乎是每个Linux发行版的一部分。您可以在/etc/bash.bashrc或/etc/profile.d/bash_completion.sh中启用它,但是通常默认情况下已启用它。通常,自动完成是新手首先遇到的Linux Shell上的第一个便捷时刻。
但是并非所有人都使用所有bash补全功能这一事实,在我看来完全是徒劳的。例如,不是所有人都知道,自动完成功能不仅适用于文件名,而且适用于别名,变量名,函数名,甚至适用于某些带有参数的命令。如果您深入研究自动完成脚本(实际上是shell脚本),甚至可以为自己的应用程序或脚本添加自动完成。
但是,让我们回到别名。
您无需编辑PATH变量或在指定目录中创建文件即可运行别名。您只需要将它们添加到配置文件或启动脚本中,然后在任何位置执行它们即可。
通常,我们在* nix中使用小写字母表示文件和目录,因此创建大写别名非常方便-在这种情况下,bash-completion 几乎会用单个字母来猜测您的命令:
- $ alias TAsteriskLog="tail -f /var/log/asteriks.log"
- $ alias TMailLog="tail -f /var/log/mail.log"
- $ TA[tab]steriksLog
- $ TM[tab]ailLog
3.使用选项卡进行Bash自动补全-第2部分
对于更复杂的情况,可能您想将个人脚本放入$ HOME / bin。
但是我们在bash中有功能。
函数不需要路径或单独的文件。(注意)bash补全也可以与函数一起使用。