unix 合并多个文件_了解10个更多的UNIX良好使用习惯

让我们面对现实:不良习惯很难克服。 但是,您刚习惯的习惯可能更难以克服。 有时,重新审视事物可能会为您提供“啊,我不知道您能做到这一点!” 时刻。 在Michael Stutz的出色文章“ 学习10种良好的UNIX使用习惯 ”的基础上,本文提出了10种更多的UNIX命令行命令,工具和技术,它们可能使您成为UNIX命令行向导更高效。

您应该采用的10个其他良好习惯是:

  • 使用文件名完成。
  • 使用历史记录扩展。
  • 重用以前的参数。
  • 使用pushdpopd管理目录导航。
  • 查找大文件。
  • 在没有编辑器的情况下创建临时文件。
  • 使用curl命令行实用程序。
  • 充分利用正则表达式。
  • 确定当前用户。
  • awk处理数据。

使用文件名补全

如果您不必在命令提示符下键入长而复杂的文件名,那不是很好吗? 好吧,事实证明您没有。 您可以配置最受欢迎的UNIX Shell来完成文件名。 此功能在每个shell中的工作方式略有不同,因此,我向您展示如何在最流行的shell中使用文件名完成。 文件名完成功能使您可以更快地键入内容并避免错误。 懒? 也许。 更高效? 绝对!

我在运行哪个shell?

如果您不知道当前正在运行哪个shell,该怎么办? 尽管这个技巧并不是10个好习惯中的正式组成部分,但它仍然非常有用。 如清单1所示,您可以使用echo $0ps â????p $$命令来显示您正在使用的shell。 就我而言,我正在运行Bash shell。

清单1.确定您的外壳
$ echo $0
-bash
$ ps â????p $$
PID TTY           TIME CMD
6344 ttys000    0:00.02 â????bash

C壳

C Shell支持最直接的文件名完成。 设置filec变量将启用该功能。 (您可以使用命令set filec )。 开始输入文件名后,您可以单击Escape ,外壳程序将填写文件名(或尽可能多地填写)。 例如,假设您有名为file1,file2和file3的文件。 如果键入f ,然后单击逃生 , 文件将被填掉,你就必须键入12 ,或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文件,而无需重新键入文件名。 您使用爆炸或感叹号( ! )来访问历史记录,并且美元符号( $ )返回上一个命令的最后一个字段。 如果您反复使用长文件名,这是一个很好的工具。

清单2.使用!$检索命令使用的最后一个文件名
$ 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参数,它是上一个命令的第一个参数。

清单3.结合使用!$和!:1
$ mv kxp12.c file_system_access.c
$ ln â????s !$ !:1

使用推入式和弹出式管理目录导航

UNIX支持各种各样的目录导航工具。 我最喜欢的两个生产力工具是pushdpopd 您当然知道cd命令会更改您的当前目录。 如果要浏览多个目录,但又希望能够快速返回某个位置,该怎么办? pushdpopd命令创建一个虚拟目录堆栈,其中pushd命令更改您的当前目录并将其存储在堆栈中,而popd命令从堆栈顶部删除该目录并将您返回到该位置。 您可以使用dirs命令显示当前目录堆栈,而无需推送或弹出新目录。 清单4显示了如何使用pushdpopd命令快速浏览目录树。

清单4.使用push和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

pushdpopd命令还支持用于操纵目录堆栈的参数。 使用+ n- n参数(其中n是一个数字),您可以向左或向右旋转堆栈,如清单5所示。

清单5.旋转目录堆栈
$ dirs
/usr/local/bin /var /etc ~ ~
$ pushd +1
/var /etc ~ ~ /usr/local/bin
$ pushd -1
~ /usr/local/bin /var /etc ~

查找大文件

是否需要找出所有可用磁盘空间去了哪里? 您可以使用以下两个工具来管理存储。 如清单6所示, df命令显示每个可用卷上使用的块总数以及可用空间的百分比。

清单6.确定卷使用量
$ 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参数的大小以千字节为单位。

清单7.查找大于10MB的所有文件
$ find / -size +10000k â????xdev â????exec ls â????lh {}\;

在没有编辑器的情况下创建临时文件

这很简单:您需要快速创建一个简单的临时文件,但不想启动您的编辑器。 cat命令与>文件重定向运算符一起使用。 如清单8所示,使用不带文件名的cat命令可以简单地回显键入到标准输入的所有内容。 >重定向会将其捕获到指定文件。 请注意,键入完毕后,您必须提供文件结尾字符,通常是Ctrl-D。

清单8.快速创建一个临时文件
$ cat > my_temp_file.txt
This is my temp file text
^D
$ cat my_temp_file.txt
This is my temp file text

是否需要做同样的事情,只是附加到现有文件而不是创建一个新文件? 如清单9所示,改为使用>>运算符。 >>文件重定向运算符将追加到现有文件。

清单9.快速附加到文件
$ cat >> my_temp_file.txt
More text
^D
$ cat my_temp_file.txt
This is my temp file text
More text

使用curl命令行实用程序

我可以从命令行访问Web吗? 你疯了吗? 不,只是curl curl命令使您可以使用HTTP,HTTPS,FTP,FTPS,Gopher,DICT,TELNET,LDAP或FILE协议从服务器检索数据。 如清单10所示,我可以使用curl命令访问我所在位置(纽约州​​布法罗)的国家气象局的当前本地情况。 grep命令结合使用时,我可以在Buffalo中检索条件。 使用-s命令行选项可禁止curl处理输出。

清单10.使用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参数指定输出的保存位置。

清单11.使用curl下载HTTP托管的文件
$ curl -o archive.tar http://www.somesite.com/archive.tar

这实际上只是您可以使用curl的提示。 您可以通过在命令提示符下键入man curl来显示curl命令的完整用法信息,从而更简单地开始探索。

充分利用正则表达式

许多UNIX命令使用正则表达式作为参数。 从技术上讲, 正则表达式是一个字符串(即由字母,数字和符号组成的字符序列),代表定义零个或多个字符串的模式。 正则表达式使用元字符(例如,星号[ * ]和问号[ ? ]符号)来匹配部分或全部其他字符串。 正则表达式不必包含通配符,但是通配符可以使正则表达式对于搜索模式和操作文件很有用。 表1显示了一些基本的正则表达式序列。

表1.正则表达式序列
序列 描述
脱字号( ^ 匹配行首的表达式,如^A
问号( ? 匹配行尾的表达式,如A?
反斜杠( \ 关闭下一个字符的特殊含义,如\^
括号( [] 匹配[aeiou]任何一个封闭字符(如[0-9]使用连字符[ - ]作为范围[0-9]
[^ ] 匹配除括号中的字符外的任何一个字符,例如[^0-9]
句点( . 匹配任何字符(行尾除外)的单个字符
星号( * 匹配零个或多个前面的字符或表达式
\{x,y\} 匹配前面出现的x到y次
\{x\} 精确匹配前面出现的x次
\{x,\} 匹配x个或多个以上的出现

清单12显示了与grep命令一起使用的一些基本正则表达式。

清单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脚本的摘录。

清单13.从命令行使用whoami
$ whoami
John
清单14.在脚本中使用whoami
if [ $(whoami) = "root" ]
then
   echo "You cannot run this script as root."
   exit 1
fi

用awk处理数据

awk命令似乎总是存在于Perl的阴影中,但是对于基于命令行的简单数据操作而言,它可能是一种快速,有用的工具。 清单15显示了如何开始使用awk命令。 要获取文件文本中每一行的length() ,请使用length()函数。 要查看文件文本中是否存在字符串ing ,请使用index()函数,该函数返回第一次出现ing的位置,以便可以将其用于进一步的字符串处理。 要对字符串进行标记化 (即,将一行分割成多个字长的段),请使用split()函数。

清单15.基本的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任务。 在清单16中 , 销售文件由每个销售员的姓名和每月的销售数字组成。 您可以使用awk命令快速汇总每个月的销售额。 默认情况下, awk将每个逗号分隔的值视为不同的字段。 您使用$ n运算符访问每个单独的字段。

清单16.使用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命令可能很复杂,并且可以在多种情况下使用。 探索awk更充分的命令,开始命令man awk中除了提到的资源相关主题 。

结论

成为命令行向导需要一些练习。 仅仅因为已经习惯了,就很容易以相同的方式做事。 扩展命令行资源可以大大提高工作效率,并促使您成为UNIX命令行向导!


翻译自: https://www.ibm.com/developerworks/aix/library/au-unixtips/index.html

你可能感兴趣的:(字符串,python,linux,java,shell)