让我们面对现实:不良习惯很难克服。 但是,您刚习惯的习惯可能更难以克服。 有时,重新审视事物可能会为您提供“啊,我不知道您能做到这一点!” 时刻。 在Michael Stutz的出色文章“ 学习10种良好的UNIX使用习惯 ”的基础上,本文提出了10种更多的UNIX命令行命令,工具和技术,它们可能使您成为UNIX命令行向导更高效。
您应该采用的10个其他良好习惯是:
pushd
和popd
管理目录导航。 curl
命令行实用程序。 awk
处理数据。 如果您不必在命令提示符下键入长而复杂的文件名,那不是很好吗? 好吧,事实证明您没有。 您可以配置最受欢迎的UNIX Shell来完成文件名。 此功能在每个shell中的工作方式略有不同,因此,我向您展示如何在最流行的shell中使用文件名完成。 文件名完成功能使您可以更快地键入内容并避免错误。 懒? 也许。 更高效? 绝对!
如果您不知道当前正在运行哪个shell,该怎么办? 尽管这个技巧并不是10个好习惯中的正式组成部分,但它仍然非常有用。 如清单1所示,您可以使用echo $0
或ps â????p $$
命令来显示您正在使用的shell。 就我而言,我正在运行Bash shell。
$ echo $0
-bash
$ ps â????p $$
PID TTY TIME CMD
6344 ttys000 0:00.02 â????bash
C
Shell支持最直接的文件名完成。 设置filec
变量将启用该功能。 (您可以使用命令set filec
)。 开始输入文件名后,您可以单击Escape ,外壳程序将填写文件名(或尽可能多地填写)。 例如,假设您有名为file1,file2和file3的文件。 如果键入f
,然后单击逃生 , 文件将被填掉,你就必须键入1
, 2
,或3
来完成相应的文件名。
Bash Shell还提供了文件名补全功能,但使用Tab键而不是Escape键。 您无需进行任何设置即可在Bash Shell中启用文件名补全; 它是默认设置。 Bash还实现了一项附加功能。 输入文件名的一部分后,然后单击Tab ,如果达到多个文件满足要求的位置,并且需要添加文本以选择一个文件,则可以再单击两次Tab以获得文件列表与您到目前为止输入的内容相符。 使用先前名为file1,file2和file3的文件示例,首先输入f
。 一次单击“ Tab”时,Bash将完成文件 ; 再单击一次“ Tab”将展开file1 file2 file3的列表。
对于Korn Shell用户,文件名的完成取决于EDITOR
变量的值。 如果EDITOR
设置为vi ,则键入名称的一部分,然后单击Escape,后跟反斜杠( \
)字符。 如果EDITOR
设置为emacs ,请键入名称的一部分,然后单击两次Escape键以完成文件名。
如果一系列命令使用相同的文件名,会发生什么? 嗯,有一个快捷方式可以快速检索您使用的上一个文件名。 如清单2所示, !$
命令返回前一个命令使用的文件名。 搜索文件“ this-is-a-long-lunch-menu-file.txt”以查找单词泡菜的出现。 搜索后, vi
命令用于编辑this-is-a-long-lunch-menu-file.txt文件,而无需重新键入文件名。 您使用爆炸或感叹号( !
)来访问历史记录,并且美元符号( $
)返回上一个命令的最后一个字段。 如果您反复使用长文件名,这是一个很好的工具。
$ grep pickles this-is-a-long-lunch-menu-file.txt
pastrami on rye with pickles and onions
$ vi !$
!$
命令返回命令使用的最后一个参数。 但是,如果您有一个使用参数的命令并且只想重用其中一个参数,会发生什么情况? !:1
运算符返回命令中使用的参数。 清单3中的示例显示了如何将此运算符与!$
运算符结合使用。 在第一个命令中,将文件重命名为一个更有意义的名称,但是为了保留原始文件名的使用,将创建一个符号链接。 文件kxp12.c
以更易读的方式重命名,然后在仍然在其他地方使用的情况下,使用链接命令创建指向原始文件名的符号链接。 !$
运算符返回file_system_access.c
参数, !:1
运算符返回kxp12.c
参数,它是上一个命令的第一个参数。
$ mv kxp12.c file_system_access.c
$ ln â????s !$ !:1
UNIX支持各种各样的目录导航工具。 我最喜欢的两个生产力工具是pushd
和popd
。 您当然知道cd
命令会更改您的当前目录。 如果要浏览多个目录,但又希望能够快速返回某个位置,该怎么办? pushd
和popd
命令创建一个虚拟目录堆栈,其中pushd
命令更改您的当前目录并将其存储在堆栈中,而popd
命令从堆栈顶部删除该目录并将您返回到该位置。 您可以使用dirs
命令显示当前目录堆栈,而无需推送或弹出新目录。 清单4显示了如何使用pushd
和popd
命令快速浏览目录树。
$ pushd .
~ ~
$ pushd /etc
/etc ~ ~
$ pushd /var
/var /etc ~ ~
$ pushd /usr/local/bin
/usr/local/bin /var /etc ~ ~
$ dirs
/usr/local/bin /var /etc ~ ~
$ popd
/var /etc ~ ~
$ popd
/etc ~ ~
$ popd
~ ~
$ popd
pushd
和popd
命令还支持用于操纵目录堆栈的参数。 使用+ n
或- n
参数(其中n是一个数字),您可以向左或向右旋转堆栈,如清单5所示。
$ dirs
/usr/local/bin /var /etc ~ ~
$ pushd +1
/var /etc ~ ~ /usr/local/bin
$ pushd -1
~ /usr/local/bin /var /etc ~
是否需要找出所有可用磁盘空间去了哪里? 您可以使用以下两个工具来管理存储。 如清单6所示, df
命令显示每个可用卷上使用的块总数以及可用空间的百分比。
$ df
Filesystem 512-blocks Used Available Capacity Mounted on
/dev/disk0s2 311909984 267275264 44122720 86% /
devfs 224 224 0 100% /dev
fdesc 2 2 0 100% /dev
map -hosts 0 0 0 100% /net
map auto_home 0 0 0 100% /home
要查找最大的文件吗? 将find
命令与-size
参数一起使用。 清单7显示了如何使用find
命令查找大于10MB的文件。 请注意, -size
参数的大小以千字节为单位。
$ find / -size +10000k â????xdev â????exec ls â????lh {}\;
这很简单:您需要快速创建一个简单的临时文件,但不想启动您的编辑器。 将cat
命令与>
文件重定向运算符一起使用。 如清单8所示,使用不带文件名的cat
命令可以简单地回显键入到标准输入的所有内容。 >
重定向会将其捕获到指定文件。 请注意,键入完毕后,您必须提供文件结尾字符,通常是Ctrl-D。
$ cat > my_temp_file.txt
This is my temp file text
^D
$ cat my_temp_file.txt
This is my temp file text
是否需要做同样的事情,只是附加到现有文件而不是创建一个新文件? 如清单9所示,改为使用>>
运算符。 >>
文件重定向运算符将追加到现有文件。
$ cat >> my_temp_file.txt
More text
^D
$ cat my_temp_file.txt
This is my temp file text
More text
我可以从命令行访问Web吗? 你疯了吗? 不,只是curl
! curl
命令使您可以使用HTTP,HTTPS,FTP,FTPS,Gopher,DICT,TELNET,LDAP或FILE协议从服务器检索数据。 如清单10所示,我可以使用curl
命令访问我所在位置(纽约州布法罗)的国家气象局的当前本地情况。 与grep
命令结合使用时,我可以在Buffalo中检索条件。 使用-s
命令行选项可禁止curl
处理输出。
$ curl â????s http://www.srh.noaa.gov/data/ALY/RWRALY | grep BUFFALO
BUFFALO MOSUNNY 43 22 43 NE13 30.10R
如清单11所示,您还可以使用curl
命令下载HTTP托管的文件。 使用-o
参数指定输出的保存位置。
$ curl -o archive.tar http://www.somesite.com/archive.tar
这实际上只是您可以使用curl
的提示。 您可以通过在命令提示符下键入man curl
来显示curl
命令的完整用法信息,从而更简单地开始探索。
许多UNIX命令使用正则表达式作为参数。 从技术上讲, 正则表达式是一个字符串(即由字母,数字和符号组成的字符序列),代表定义零个或多个字符串的模式。 正则表达式使用元字符(例如,星号[ *
]和问号[ ?
]符号)来匹配部分或全部其他字符串。 正则表达式不必包含通配符,但是通配符可以使正则表达式对于搜索模式和操作文件很有用。 表1显示了一些基本的正则表达式序列。
序列 | 描述 |
---|---|
脱字号( ^ ) |
匹配行首的表达式,如^A |
问号( ? ) |
匹配行尾的表达式,如A? |
反斜杠( \ ) |
关闭下一个字符的特殊含义,如\^ |
括号( [] ) |
匹配[aeiou] 任何一个封闭字符(如[0-9] 使用连字符[ - ]作为范围[0-9] 。 |
[^ ] |
匹配除括号中的字符外的任何一个字符,例如[^0-9] |
句点( . ) |
匹配任何字符(行尾除外)的单个字符 |
星号( * ) |
匹配零个或多个前面的字符或表达式 |
\{x,y\} |
匹配前面出现的x到y次 |
\{x\} |
精确匹配前面出现的x次 |
\{x,\} |
匹配x个或多个以上的出现 |
清单12显示了与grep
命令一起使用的一些基本正则表达式。
$ # Lists your mail
$ grep '^From: ' /usr/mail/$USER
$ # Any line with at least one letter
$ grep '[a-zA-Z]' search-file.txt
$ # Anything not a letter or number
$ grep '[^a-zA-Z0-9] search-file.txt
$ # Find phone numbers in the form 999-9999
$ grep '[0-9]\{3\}-[0-9]\{4\}' search-file.txt
$ # Find lines with exactly one character
$ grep '^.$' search-file.txt
$ # Find any line that starts with a period "."
$ grep '^\.' search-file.txt
$ # Find lines that start with a "." and 2 lowercase letters
$ grep '^\.[a-z][a-z]' search-file.txt
已经写了很多关于正则表达式的书。 要更深入地了解命令行正则表达式,我建议您在developerWorks文章“ 说UNIX,第9部分:正则表达式 ”中找到。
有时,您可能具有要确保某个用户已执行或未执行的管理脚本。 要找出whoami
,您可以使用whoami
命令返回当前用户的名称。 清单13显示了whoami
命令自己运行的情况; 清单14显示了使用whoami
确保当前用户不是root的Bash脚本的摘录。
$ whoami
John
if [ $(whoami) = "root" ]
then
echo "You cannot run this script as root."
exit 1
fi
awk
命令似乎总是存在于Perl的阴影中,但是对于基于命令行的简单数据操作而言,它可能是一种快速,有用的工具。 清单15显示了如何开始使用awk
命令。 要获取文件文本中每一行的length()
,请使用length()
函数。 要查看文件文本中是否存在字符串ing ,请使用index()
函数,该函数返回第一次出现ing的位置,以便可以将其用于进一步的字符串处理。 要对字符串进行标记化 (即,将一行分割成多个字长的段),请使用split()
函数。
$ cat text
testing the awk command
$ awk '{ i = length($0); print i }' text
23
$ awk '{ i = index($0,â????ingâ????); print i}' text
5
$ awk 'BEGIN { i = 1 } { n = split($0,a," "); while (i <= n) {print a[i]; i++;} }' text
testing
the
awk
command
打印文本文件的指定字段是一个简单的awk
任务。 在清单16中 , 销售文件由每个销售员的姓名和每月的销售数字组成。 您可以使用awk
命令快速汇总每个月的销售额。 默认情况下, awk
将每个逗号分隔的值视为不同的字段。 您使用$ n
运算符访问每个单独的字段。
$cat sales
Gene,12,23,7
Dawn,10,25,15
Renee,15,13,18
David,8,21,17
$ awk -F, '{print $1,$2+$3+$4}' sales
Gene 42
Dawn 50
Renee 46
David 46
awk
命令可能很复杂,并且可以在多种情况下使用。 探索awk
更充分的命令,开始命令man awk
中除了提到的资源相关主题 。
成为命令行向导需要一些练习。 仅仅因为已经习惯了,就很容易以相同的方式做事。 扩展命令行资源可以大大提高工作效率,并促使您成为UNIX命令行向导!
翻译自: https://www.ibm.com/developerworks/aix/library/au-unixtips/index.html