unix 合并多个文件

    技术2024-05-28  76

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

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

    使用文件名完成。 使用历史记录扩展。 重用以前的参数。 使用pushd和popd管理目录导航。 查找大文件。 在没有编辑器的情况下创建临时文件。 使用curl命令行实用程序。 充分利用正则表达式。 确定当前用户。 用awk处理数据。
    常用缩略语
    MB:兆字节 HTTP:超文本传输​​协议 HTTPS:安全套接字层上的HTTP FTP:文件传输协议 FTPS:安全套接字层上的FTP LDAP:轻型目录访问协议

    使用文件名补全

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

    我在运行哪个shell?

    如果您不知道当前正在运行哪个shell,该怎么办? 尽管这个技巧并不是10个好习惯中的正式组成部分,但它仍然非常有用。 如清单1所示,您可以使用echo $0或ps â????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 ,然后单击逃生 , 文件将被填掉,你就必须键入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文件,而无需重新键入文件名。 您使用爆炸或感叹号( ! )来访问历史记录,并且美元符号( $ )返回上一个命令的最后一个字段。 如果您反复使用长文件名,这是一个很好的工具。

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

    清单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

    pushd和popd命令还支持用于操纵目录堆栈的参数。 使用+ 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

    相关资源:微信小程序源码-合集6.rar
    Processed: 0.039, SQL: 9