专栏首页CU技术社区培养这10个习惯,你就离UNIX高手更进一步了

培养这10个习惯,你就离UNIX高手更进一步了

上一篇文章中我们列出了使用 Unix/Linux 系统时的10条建议,相信即便是很熟悉这些概念的老手,一旦重新审视自己平时的某些使用习惯时也会有新的收获。在上一篇的基础上,这里是另外 10 个 UNIX 命令行命令、工具和技术,让你成为更高效的 UNIX 命令行高手。

10个好习惯

  1. 使用文件名自动补全功能 (file name completion)。
  2. 使用历史扩展。
  3. 重用以前的参数。
  4. 使用 pushd 和 popd 管理目录导航。
  5. 查找大型文件。
  6. 不使用编辑器创建临时文件。
  7. 使用 curl 命令行实用工具。
  8. 最有效地利用正则表达式。
  9. 确定当前用户。
  10. 使用 awk 处理数据。

1. 文件名自动补全

文件名自动补全功能让你无需在命令提示符处键入各种又臭又长的文件名,避免输入错误,提高效率。这个功能在各个 Shell 中的工作方式略有不同,所以首先请确定自己用的是哪种shell。

我正在运行哪种 Shell?

可以使用 echo $0 或 ps -p $$ 命令显示您正在使用的 Shell。

List1:确定你的shell

$ echo $0 -bash $ ps –p $$ PID TTY TIME CMD 6344 ttys000 0:00.02 –bash

C Shell

C Shell 支持最直接文件名补全功能。设置 filec 变量即可启用该功能(使用命令 set filec)。在您开始键入文件名后,可以按 Esc 键,Shell 将补全文件名或者补全尽可能多的部分。例如,假设有名为 file1、file2 和 file3 的文件。如果键入 f,然后按 Esc 键,将填充 file,之后你需要输入 1、2 或 3 来完成相应的文件名。

Bash

Bash Shell 也提供了文件名补全功能,但它使用 的是Tab 键。您在 Bash Shell 中不需要设置任何选项即可启用文件名补全功能,该选项是缺省设置的。Bash 还实现了其他功能。键入文件名的一部分后,按 Tab 键,如果有多个文件满足您的请求,并且您需要添加文本以选择其中一个文件,那么您可以多按 Tab 键两次,以显示与您目前键入的内容相匹配的文件的列表。

用之前名为 file1、file2 和 file3 的文件示例,首先键入 f。当按一次 Tab 键时,Bash 自动补全显示file;再按一次 Tab 键时,将展开列表 file1 file2 file3。

Korn Shell

对于 Korn Shell 用户,文件名补全功能取决于 EDITOR 变量的值。如果 EDITOR 设置为 vi,那么您键入部分名称,然后按 Esc 键后跟反斜杠 () 字符。如果 EDITOR 设置为 emacs,那么您键入部分名称,然后按两次 Esc 键以补全文件名。

2. 使用历史扩展

如果你的一系列命令都用了相同的文件名,会发生什么情况?有一种快捷方式可以快速获得你上次使用的文件名。如List 2 所示,!$ 命令返回前一个命令使用的文件名。

从文件 this-is-a-long-lunch-menu-file.txt 中搜索单词 pickles 的出现位置。搜索结束后,用 vi 命令来编辑 this-is-a-long-lunch-menu-file.txt 文件,而不需要重新键入文件名。用感叹号 (!) 来访问历史,然后使用美元符号 ($) 返回前一命令的最后字段。如果你需要反复用到长文件名,那么这是一个非常好的工具。

List2:用 !$ 获得前一个命令使用的文件名

$ grep pickles this-is-a-long-lunch-menu-file.txt pastrami on rye with pickles and onions $ vi !$

3. 重用以前的参数

!$ 命令返回某个命令使用的上一个文件名参数。但如果某个命令使用多个文件名,而您只希望重用其中一个文件名,该如何做?

!:1 操作符返回某个命令使用的第一个文件名。

List 3 中的示例显示可以如何将此操作符与 !$ 运算符组合使用。在第一个命令中,将一个文件重新命名为更有意义的名称,但为了保持原始文件名可用,创建了一个符号链接。重新命名文件 kxp12.c 以提高可读性,然后使用 link 命令来创建到原始文件名的符号链接,以防在其他位置使用该文件名。!$ 操作符返回 file_system_access.c 文件名,而 !:1 操作符返回 kxp12.c 文件名,该文件名是上个命令的第一个文件名。

List3:组合使用 !$ 和 !:1

$ mv kxp12.c file_system_access.c $ ln –s !$ !:1

4. 使用 pushd 和 popd 管理目录导航

UNIX 支持各种目录导航工具,我最喜欢的两款提高工作效率的工具是 pushd 和 popd。您肯定知道 cd 命令用于更改当前目录。如果要在多个目录中导航,但希望能够快速返回某个位置,该如何做?

pushd 和 popd 命令创建一个虚拟目录堆栈,pushd 命令用来更改您的当前目录并将其存储在堆栈中,而 popd 命令用来从堆栈的顶部移除目录并使您返回该位置。可以使用 dirs 命令来显示当前目录堆栈。

List4:使用 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 是一个数字,可以向左或向右移动堆栈:

List5:旋转目录堆栈

$ dirs /usr/local/bin /var /etc ~ ~ $ pushd +1 /var /etc ~ ~ /usr/local/bin $ pushd -1 ~ /usr/local/bin /var /etc ~

5. 查找大型文件

有时候需要找出磁盘空间到底被什么占用了?可以使用以下几个工具来管理存储设备。df 命令显示每个可用卷上已使用的块的总数以及空闲空间的百分比。

List6:确定各卷的使用情况

$ 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 参数。List 7 显示了如何使用 find 命令来查找大于 10MB 的文件。注意,-size 参数以 KB 为单位计量大小。

List7:查找大于10MB的所有文件

$ find / -size +10000k –xdev –exec ls –lh {};

6. 不要用编辑器创建临时文件

下面是个简单示例:需要快速创建一个简单临时文件,但不想启动编辑器。使用带有 > 文件重定向操作符的 cat 命令。

如List 8所示,使用不带文件名的 cat 命令只回显向标准输入键入的任何内容;> 重定向将该输入捕获到指定的文件中。注意,在结束输入时必须提供文件结束字符,一般是 Ctrl-D。

List8:快速创建临时文件

$ cat > my_temp_file.txt This is my temp file text ^D $ cat my_temp_file.txt This is my temp file text

要执行相同操作,但是附加到现有文件而不是创建新文件。如List 9 所示,改用 >> 操作符。>> 文件重定向操作符向现有文件附加内容。

List9:快速向文件附加内容

$ cat >> my_temp_file.txt More text ^D $ cat my_temp_file.txt This is my temp file text More text

7. 使用 curl 命令行实用工具

想从命令行访问 Web?用 curl 命令!curl 命令使您可以使用 HTTP、HTTPS、FTP、FTPS、Gopher、DICT、TELNET、LDAP 或 FILE 协议从服务器检索数据。

例如,用 curl 命令来下载 HTTP 托管的文件。使用 -o 参数来指定保存输出的位置“

List10:用 curl 下载文件

$ curl -o archive.tar http://www.somesite.com/archive.tar

curl命令非常强大,可以通过man curl了解更多它的功能 。

8. 最有效的利用正则表达式

大量 UNIX 命令使用正则表达式作为参数。从技术角度而言,正则表达式是表示某种模式的字符串(也就是说,由字母、数字和符号组成的字符序列),用于定义零或更长的字符串。正则表达式使用元字符(例如,星号 [*] 和问号 [?])来匹配其他字符串的部分或全部内容。正则表达式不一定包含通配符,但通配符可以使正则表达式在搜索模式和处理文件时发挥更大的作用。表 1 显示了一些基本正则表达式序列。

表 1. 正则表达式序列

序列

说明

脱字符 (^)

匹配出现在行首的表达式,例如 ^A

美元符号 ($)

匹配出现在行末的表达式,例如 A$

反斜杠 ()

取消下一个字符的特殊含义,例如 ^

方括号 ([])

匹配括起来的任一字符,例如 [aeiou](使用连字符 [-] 表示范围,例如 [0-9])。

[^ ]

匹配除括起来字符以外的任一字符,例如 [^0-9]

句点 (.)

匹配除行尾之外的任意单个字符

星号 (*)

匹配零个或多个前驱字符或表达式

{x,y}

匹配出现过 x 到 y 个和前面相同的内容

{x}

精确匹配出现过 x 个和前面相同的内容

{x,}

匹配出现过 x 个或更多和前面相同的内容

以下是经常与 grep 命令一起使用的一些基本正则表达式:

List11:使用正则表达式和 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

9. 确定当前用户

有时查找问题是,需要确定某个特定用户是否运行过您的管理脚本。为找出答案,您可以使用 whoami 命令来返回当前用户的名称:

List12:从命令行使用 whoami

$ whoami John

List13:用 whoami 确保当前用户不是根用户的 Bash 脚本

if [ $(whoami) = "root" ] then echo "You cannot run this script as root." exit 1 fi

10. 用awk处理数据

awk 命令似乎始终处在 Perl 的阴影下,但它对于简单、基于命令行的数据处理来说是一个快速、实用的工具。List 14 展示了如何开始使用 awk 命令。

若要获取文件中每行文本的长度,用 length() 函数。若要查看字符串 ing 是否出现在文件文本中,请用 index() 函数,该函数返回 ing 首次出现的位置,这样您就可以使用它来进行进一步的字符串处理。若要 tokenize(也就是说,将一行拆分为单词长度的片段)某个字符串,请使用 split() 函数。

List14:基本awk处理

$ 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 任务。在List 15中,sales 文件包含每个销售人员的姓名,后跟每月销售数字。可以使用 awk 命令来快速获得每个月的销售总额。缺省情况下,awk 将每个以逗号分隔的值视为不同的字段。用 $n 操作符来访问每个字段。

List15:用awk对数据进行汇总

$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 命令可以很复杂并应用于广泛的情景中。

来自:IBM developerWorks 链接:https://www.ibm.com/developerworks/cn/aix/library/au-unixtips/

本文分享自微信公众号 - CU技术社区(ChinaUnix2013),作者:Linux学习

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-10-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 我老实人,如何思考与表达?

    很多时候,会收到一些小伙伴的感概:那谁谁谁谁表达的很有逻辑和条理性,真的是太羡慕了!

    用户6543014
  • 谷歌CEO:AI或许是目前最重要的发明,比电的意义更大;聚划算百亿补贴:加大口罩等货品补贴力度,已上线抗病毒专区|ITDaily

    在2020冬季达沃斯年会上,谈及对于AI的看法,谷歌CEO桑达尔·皮查伊认为,AI或许是人类目前最重要的发明,将会比电和火对人类的影响更大。面对每个科技发明,都...

    用户6543014
  • 基本操作?这46个 Linux 面试常见问题送给你

    绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示? 切换目录用什么命令?

    用户6543014
  • 培养这10个习惯,你就离UNIX高手更进一步了

    来自:IBM developerWorks 链接:https://www.ibm.com/developerworks/cn/aix/library/au-un...

    企鹅号小编
  • 【图解】大数据图解世界杯点球大战:前锋后卫老鸟小将谁靠谱?

    命中率九宫格,蓝色表示右脚罚点球的进球数,橙色表示左脚的 6月29日凌晨,巴西世界杯迎来了首场淘汰赛。此前表现不俗的智利队将东道主拖入了残酷的点球大战。 足球比...

    小莹莹
  • 转行大数据,编程学Java还是Python?

    Python和Java,是大数据行业最常见的两种编程语言,对于想转行大数据的人来说,学习哪个语言是比较好的选择呢?

    加米谷大数据
  • vue 实践记录

    使用:const files = require.context(directory, useSubdirectories, regExp)

    易墨
  • linaro公司及其op-tee介绍

    2010年3月由ARM、NXP(飞思卡尔)、IBM、三星、ST-Ericsson和德州仪器,宣布共同出资组建Linaro公司。这家非营利性质的开放源代码软件工程...

    安智客
  • 大数据24小时 | 银联智惠发布数字营销产品 iSmart,“国双”成中国首家赴美上市大数据创企

    <数据猿导读> 大数据分析软件提供商“国双”赴美上市,IPO融资达8700万美元;来自澳大利亚的云服务平台 Whispir获1175万美元融资;健康大数据平台碳...

    数据猿
  • 我老实人,如何思考与表达?

    很多时候,会收到一些小伙伴的感概:那谁谁谁谁表达的很有逻辑和条理性,真的是太羡慕了!

    用户6543014

扫码关注云+社区

领取腾讯云代金券