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

养成这10个习惯,你离UNIX高手又近了一步!

时间:2023-03-23 10:29:31 科技观察

本文提出10个值得养成的UNIX命令行习惯——好习惯,帮助你克服许多常见的使用怪癖,并在过程中提高命令行生产力,让你成为更高效的UNIX命令行高手。下面列出了10个好习惯,并附有更详细的说明。10个好习惯使用文件名完成。使用历史扩展。重用以前的参数。使用pushd和popd管理目录导航。查找大文件。不使用编辑器创建临时文件。使用curl命令行实用程序。充分利用正则表达式。识别当前用户。使用awk处理数据。1、文件名自动补全文件名自动补全功能让您不用在命令提示符下输入各种又臭又长的文件名,避免输入错误,提高效率。此功能在每个shell中的工作方式略有不同,因此首先确定您使用的是哪个shell。我运行的是哪种shell?您可以使用echo$0或ps-p$$命令来显示您使用的是哪个shell。List1:确保你的shell$echo$0-bash$ps–p$$PIDTTYTIMECMD6344ttys0000:00.02–bashCShellCShell支持最直接的文件名补全功能。这是通过设置filec变量启用的(使用命令setfilec)。开始键入文件名后,可以按Esc键,shell将完成文件名或尽可能多的部分。例如,假设您有名为file1、file2和file3的文件。如果键入f然后按Esc,将填充文件,之后您需要输入1、2或3以完成相应的文件名。BashBashShell还提供文件名补全,但它使用Tab键。您不需要设置任何选项来在Bashshell中启用文件名完成,它是默认设置的。Bash还实现了其他功能。输入部分文件名后,按Tab键,如果有多个文件满足您的要求,需要添加文本选择其中一个,您可以再按两次Tab键,显示匹配文件列表。使用前面的名为file1、file2和file3的文件示例,首先键入f。按一次Tab键时,Bash自动完成显示文件;当再次按下Tab键时,列表file1file2file3将展开。KornShell对于KornShell用户,文件名完成取决于EDITOR变量的值。如果将EDITOR设置为vi,则键入部分名称,然后按Esc键,然后是反斜杠(\)字符。如果EDITOR设置为emacs,则键入部分名称,然后按两次Esc以完成文件名。2.使用历史扩展如果你对一系列命令使用相同的文件名会怎样?有一个快捷方式可以快速获取您使用的最后一个文件名。如清单2所示,!$命令返回前一个命令使用的文件名。在文件this-is-a-long-lunch-menu-file.txt中搜索单词pickles的匹配项。搜索后,使用vi命令编辑this-is-a-long-lunch-menu-file.txt文件,无需重新输入文件名。使用感叹号(!)访问历史记录,使用美元符号($)返回上一个命令的最后一个字段。如果您需要重复使用长文件名,这是一个很好的工具。清单2:使用!$获取上一个命令$greppicklesthis-is-a-long-lunch-menu-file.txtpastramionryewithpicklesandonions$vi!$3使用的文件名。Reusepreviousparameters!$命令返回命令名称参数使用的先前文件。但是,如果一个命令使用多个文件名而您只想重用其中一个怎么办?!:1运算符返回命令使用的第一个文件名。清单3中的示例显示了如何将此运算符与!$运算符结合使用。在第一个命令中,文件被重命名为更有意义的名称,但为了保持原始文件名可用,创建了一个符号链接。将文件重命名为kxp12.c以获得更好的可读性,然后使用链接命令创建指向原始文件名的符号链接,以防在其他地方使用它。!$运算符返回file_system_access.c文件名,而!:1运算符返回kxp12.c文件名,这是上一个命令的第一个文件名。清单3:组合!$和!:1$mvkxp12.cfile_system_access.c$ln–s!$!:14。使用pushd和popd管理目录导航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~~$popdpushd和popd命令也支持目录栈的参数操作。使用+n或-n参数,其中n是一个数字,向左或向右移动堆栈:List5:Rotatedirectorystack$dirs/usr/local/bin/var/etc~~$pushd+1/var/etc~~/usr/local/bin$pushd-1~/usr/local/bin/var/etc~5.查找大文件有时您需要找出占用磁盘空间的是什么?有多种工具可用于管理存储设备。df命令显示已用块的总数和每个可用卷上可用空间的百分比。List6:确定每个卷的使用情况$dfFilesystem512-blocksUsedAvailableCapacityMountedon/dev/disk0s23119099842672752644412272086%/devfs2242240100%/devfdesc220100%/devmap-hosts000100%/netmapautohome找大文件?将-size参数与find命令一起使用。清单7展示了如何使用find命令查找大于10MB的文件。请注意,-size参数以KB为单位测量大小。清单7:查找所有大于10MB的文件$find/-size+10000k–xdev–execls–lh{}\;6.不要使用编辑器创建临时文件下面是一个简单的例子:需要快速创建一个简单的临时文件,但又不想启动编辑器。将cat命令与>文件重定向运算符一起使用。如清单8所示,使用不带文件名的cat命令只会回显输入到标准输入中的任何内容;>重定向将输入捕获到指定的文件中。请注意,必须在输入的末尾提供一个文件结束字符,通常是Ctrl-D。清单8:快速创建一个临时文件$cat>my_temp_file.txtThisismytempfiletext^D$catmy_temp_file.txtThisismytempfiletext做同样的事情,但附加到现有文件而不是创建新文件。如清单9所示,改用>>运算符。>>文件重定向运算符将内容附加到现有文件。清单9:快速将内容附加到文件$cat>>my_temp_file.txtMoretext^D$catmy_temp_file.txtThisismytempfiletextMoretext7。使用curl命令行实用程序想从命令行访问Web?使用卷曲命令!curl命令允许您使用HTTP、HTTPS、FTP、FTPS、Gopher、DICT、TELNET、LDAP或FILE协议从服务器检索数据。例如,使用curl命令下载HTTP托管的文件。使用-o参数指定保存输出的位置》List10:使用curl下载文件$curl-oarchive.tarhttp://www.somesite.com/archive.tarcurl命令很强大,大家可以学习通过mancurl了解更多它的功能8.正则表达式最有效的使用大量的UNIX命令都使用正则表达式作为参数,从技术角度看,正则表达式是表示一定模式的字符串(即由字符组成字母、数字和符号的组合。序列)来定义零或更长的字符串。正则表达式使用元字符(例如,星号[*]和问号[?])来匹配部分或全部其他字符串。正则表达式不一定要包含通配符,但是通配符可以让正则表达式在搜索模式和处理文件方面更加强大。表1显示了一些基本的正则表达式序列。表1.正则表达式序列序列描述插入符号(^)匹配出现在行首的表达式,例如^A美元符号($)匹配出现在行尾的表达式,例如A$反斜杠(\)取消后面一个字符的特殊含义,如\^方括号([])匹配任何括起来的字符,如[aeiou](用连字符[-]表示范围,如[0-9]).[^]匹配除封闭字符以外的任何字符,例如[^0-9]句点(.)匹配除行尾星号(*)之外的任何单个字符匹配零个或多个前面的字符或表达式表达式\{x,y\}匹配x到y次与之前相同的内容\{x\}完全匹配x次与之前相同的内容\{x,\}匹配x次或更多次与之前相同这是一些基本的正则表达式经常与grep命令一起使用的:List11:Usingregularexpressionswithgrep$#Listsyourmail$grep'^From:'/usr/mail/$USER$#Anylinewithleastoneletter$grep'[a-zA-Z]'search-file.txt$#Anythingnotaletterornumber$grep'[^a-zA-Z0-9]search-file.txt$#Findphonenumbersintheform999-9999$grep'[0-9]\{3\}-[0-9]\{4\}'search-file.txt$#Findlineswithexactlyonecharacter$grep'^.$'search-file.txt$#Findanylinethatstartswithaperiod"."$grep'^\.'search-file.txt$#Findlinesthatstartwitha"."and2lowercasletters$grep'^\.[a-z][a-z]'搜索文件.txt9。确定当前用户有时查找的问题是您需要确定特定用户是否曾经运行过您的管理脚本。要找出答案,您可以使用whoami命令返回当前用户的名称:List12:从命令行使用whoami$whoamiJohnList13:使用whoami确保当前用户不是root的Bash脚本if[$(whoami)=“root”]thenecho“您不能以root身份运行此脚本。”exit1fi10。用awk处理数据awk命令似乎一直处于Perl的阴影之下,但它是一种用于简单的、基于命令行的数据处理的快速、实用的工具。清单14展示了如何开始使用awk命令。要获取文件中每行文本的长度,请使用length()函数。要查看字符串ing是否出现在文件文本中,请使用index()函数,该函数返回ing***出现的位置,以便您可以使用它进行进一步的字符串处理。要标记化(即,将一行拆分为字长的片段)字符串,请使用split()函数。清单14:基本awk处理$cattexttestingtheawkcommand$awk'{i=length($0);printi}'text23$awk'{i=index($0,"ing");printi}'text5$awk'BEGIN{i=1}{n=split($0,a,"");while(i<=n){printa[i];i++;}}'text测试awk命令以打印文本文件中的指定字段是一项简单的awk任务。在清单15中,销售文件包含每个销售人员的姓名,后跟每月的销售数字。您可以使用awk命令快速获取每个月的总销售额。默认情况下,awk将每个逗号分隔值视为一个不同的字段。使用$n运算符访问每个字段。List15:使用awk汇总数据$catsalesGene,12,23,7Dawn,10,25,15Renee,15,13,??18David,8,21,17$awk-F,'{print$1,$2+$3+$4}'salesGene42Dawn50Renee46David46