练习 8:更多的重定向和过滤:head,tail,awk,grep,sed
来源:互联网 发布:自动化软件开发工程师 编辑:程序博客网 时间:2024/06/10 05:38
现在你试过了 Linux,我会介绍一下 Unix 的方式。注意看。
这就是 Unix 的哲学:写一些程序,只做一件事,并且把它做好。编写程序,使其一起工作。编写程序来处理文本流,因为这是一个通用接口。
实际上这意味着为了熟练使用 Linux,你需要知道如何从一个程序中获取输出,并将其提供给另一个程序,通常会在此过程中修改它。通常,你可以通过使用管道,将多个程序合并在一起,它允许将一个程序的输出连接到另一个程序。像这样:
这里发生的事情真的很简单。几乎每个 Linux 程序在启动时打开这三个文件:
stdin
- 标准输入。这是程序读取东西的地方。 stdout
- 标准输出。这是程序写出东西的地方。 stderr
- 标准错误。这是程序报错的地方。
这就是它的读取方式:
启动程序 1 开始从键盘读取数据 开始向显示器写出错误 启动程序 2 开始从程序 1 读取输入 开始向显示器写出错误 启动程序 3 开始从程序 2 读取输入 开始向显示器写出错误 开始向显示器写出数据
还有另一种方式来描绘发生的事情,如果你喜欢 South Park 风格的幽默,但要小心:看到的是不会是不可见的!警告!你无法忽略它。
让我们考虑以下管道,它接受ls -al
的输出,仅打印文件名和文件修改时间:
ls -al | tr -s ' ' | cut -d ' ' -f 8,9
这是所发生事情的概述:
启动 ls -al 获取当前目录中的文件列表 向显示器写出错误 向管道写出输出 启动 tr -s ' ' 通过管道从 ls -al 读取输入 两个字段之间只保留一个空格 向显示器写出错误 向管道写出输出 启动 cut -d ' ' -f 8,9 通过管道从 tr -s ' ' 读取输入 只保留字段 8 和 9,扔掉其它东西 向显示器写出错误 向显示器写出输出
更详细地说,这是每一步发生的事情:
第一步:ls -al
,我们获取了目录列表,每一列都叫做字段。
user1@vm1:~$ ls -altotal 52drwxr-xr-x 2 user1 user1 4096 Jun 18 14:16 .drwxr-xr-x 3 root root 4096 Jun 6 21:49 ..-rw------- 1 user1 user1 4865 Jun 15 19:34 .bash_history-rw-r--r-- 1 user1 user1 220 Jun 6 21:48 .bash_logout-rw-r--r-- 1 user1 user1 3184 Jun 14 12:24 .bashrc-rw-r--r-- 1 user1 user1 64 Jun 18 14:16 hello.txt-rw------- 1 user1 user1 89 Jun 18 16:26 .lesshst-rw-r--r-- 1 user1 user1 634 Jun 15 20:03 ls.out-rw-r--r-- 1 user1 user1 697 Jun 7 12:25 .profile-rw-r--r-- 1 user1 user1 741 Jun 7 12:19 .profile.bak-rw-r--r-- 1 user1 user1 741 Jun 7 13:12 .profile.bak1-rw------- 1 user1 user1 666 Jun 18 14:16 .viminfo
第二步:ls -al | tr -s ' '
,我们在两个字段之间只保留,因为cut
不能将多个空格理解为一种方式,来分离多个字段。
user1@vm1:~$ ls -al | tr -s ' 'total 52drwxr-xr-x 2 user1 user1 4096 Jun 18 14:16 .drwxr-xr-x 3 root root 4096 Jun 6 21:49 ..-rw------- 1 user1 user1 4865 Jun 15 19:34 .bash_history-rw-r--r-- 1 user1 user1 220 Jun 6 21:48 .bash_logout-rw-r--r-- 1 user1 user1 3184 Jun 14 12:24 .bashrc-rw-r--r-- 1 user1 user1 64 Jun 18 14:16 hello.txt-rw------- 1 user1 user1 89 Jun 18 16:26 .lesshst-rw-r--r-- 1 user1 user1 634 Jun 15 20:03 ls.out-rw-r--r-- 1 user1 user1 697 Jun 7 12:25 .profile-rw-r--r-- 1 user1 user1 741 Jun 7 12:19 .profile.bak-rw-r--r-- 1 user1 user1 741 Jun 7 13:12 .profile.bak1-rw------- 1 user1 user1 666 Jun 18 14:16 .viminfo
第三步:我们只保留字段 8 和 9,它们是我们想要的。
user1@vm1:~$ ls -al | tr -s ' ' | cut -d ' ' -f 8,914:16 .21:49 ..19:34 .bash_history21:48 .bash_logout12:24 .bashrc14:16 hello.txt16:26 .lesshst20:03 ls.out12:25 .profile12:19 .profile.bak13:12 .profile.bak114:16 .viminfo
现在你学到了,如何从一个程序获取输入,并将其传给另一个程序,并且如何转换它。
这样做
1: ls -al | head -n 5 2: ls -al | tail -n 5 3: ls -al | awk '{print $8, $9}' 4: ls -al | awk '{print $9, $8}' 5: ls -al | awk '{printf "%-20.20s %s\n",$9, $8}' 6: ls -al | grep bash 7: ls -al > ls.out 8: cat ls.out 9:
cat ls.out | sed 's/bash/I replace this!!!/g'
你会看到什么
user1@vm1:~$ ls -al | head -n 5total 52drwxr-xr-x 2 user1 user1 4096 Jun 18 14:16 .drwxr-xr-x 3 root root 4096 Jun 6 21:49 ..-rw------- 1 user1 user1 4865 Jun 15 19:34 .bash_history-rw-r--r-- 1 user1 user1 220 Jun 6 21:48 .bash_logoutuser1@vm1:~$ ls -al | tail -n 5-rw-r--r-- 1 user1 user1 636 Jun 18 17:52 ls.out-rw-r--r-- 1 user1 user1 697 Jun 7 12:25 .profile-rw-r--r-- 1 user1 user1 741 Jun 7 12:19 .profile.bak-rw-r--r-- 1 user1 user1 741 Jun 7 13:12 .profile.bak1-rw------- 1 user1 user1 666 Jun 18 14:16 .viminfouser1@vm1:~$ ls -al | awk '{print $8, $9}'14:16 .21:49 ..19:34 .bash_history21:48 .bash_logout12:24 .bashrc14:16 hello.txt16:26 .lesshst17:52 ls.out12:25 .profile12:19 .profile.bak13:12 .profile.bak114:16 .viminfouser1@vm1:~$ ls -al | awk '{print $9, $8}'. 14:16.. 21:49.bash_history 19:34.bash_logout 21:48.bashrc 12:24hello.txt 14:16.lesshst 16:26ls.out 17:52.profile 12:25.profile.bak 12:19.profile.bak1 13:12.viminfo 14:16user1@vm1:~$ ls -al | awk '{printf "%-20.20s %s\n",$9, $8}'. 14:16.. 21:49.bash_history 19:34.bash_logout 21:48.bashrc 12:24hello.txt 14:16.lesshst 16:26ls.out 17:52.profile 12:25.profile.bak 12:19.profile.bak1 13:12.viminfo 14:16user1@vm1:~$ ls -al | grep bash-rw------- 1 user1 user1 4865 Jun 15 19:34 .bash_history-rw-r--r-- 1 user1 user1 220 Jun 6 21:48 .bash_logout-rw-r--r-- 1 user1 user1 3184 Jun 14 12:24 .bashrcuser1@vm1:~$ ls -al > ls.outuser1@vm1:~$ cat ls.outtotal 48drwxr-xr-x 2 user1 user1 4096 Jun 18 14:16 .drwxr-xr-x 3 root root 4096 Jun 6 21:49 ..-rw------- 1 user1 user1 4865 Jun 15 19:34 .bash_history-rw-r--r-- 1 user1 user1 220 Jun 6 21:48 .bash_logout-rw-r--r-- 1 user1 user1 3184 Jun 14 12:24 .bashrc-rw-r--r-- 1 user1 user1 64 Jun 18 14:16 hello.txt-rw------- 1 user1 user1 89 Jun 18 16:26 .lesshst-rw-r--r-- 1 user1 user1 0 Jun 18 17:53 ls.out-rw-r--r-- 1 user1 user1 697 Jun 7 12:25 .profile-rw-r--r-- 1 user1 user1 741 Jun 7 12:19 .profile.bak-rw-r--r-- 1 user1 user1 741 Jun 7 13:12 .profile.bak1-rw------- 1 user1 user1 666 Jun 18 14:16 .viminfouser1@vm1:~$ cat ls.out | sed 's/bash/I replace this!!!/g'total 48drwxr-xr-x 2 user1 user1 4096 Jun 18 14:16 .drwxr-xr-x 3 root root 4096 Jun 6 21:49 ..-rw------- 1 user1 user1 4865 Jun 15 19:34 .I replace this!!!_history-rw-r--r-- 1 user1 user1 220 Jun 6 21:48 .I replace this!!!_logout-rw-r--r-- 1 user1 user1 3184 Jun 14 12:24 .I replace this!!!rc-rw-r--r-- 1 user1 user1 64 Jun 18 14:16 hello.txt-rw------- 1 user1 user1 89 Jun 18 16:26 .lesshst-rw-r--r-- 1 user1 user1 0 Jun 18 17:53 ls.out-rw-r--r-- 1 user1 user1 697 Jun 7 12:25 .profile-rw-r--r-- 1 user1 user1 741 Jun 7 12:19 .profile.bak-rw-r--r-- 1 user1 user1 741 Jun 7 13:12 .profile.bak1-rw------- 1 user1 user1 666 Jun 18 14:16 .viminfo
解释
- 只打印目录列表中的前 5 个条目。
- 只打印目录列表中的后 5 个条目。
- 只打印修改时间和文件名。注意我如何使用
awk
,这比cut
更聪明。这里的区别就是,cut
只能将单个符号(我们这里是空格)理解为一种方式,来分离字段(字段分隔符),awk
将任意数量的空格和 TAB 看做文件分隔符,所以没有必要使用tr
来消除不必要的空格。 - 按此顺序打印文件名和修改时间。这又是
cat
不能做的事情。 - 工整地打印文件名和修改时间。注意现在输出如何变得更清晰。
- 仅打印目录列表中包含
bash
的行。 - 将目录列表的输出写入文件
ls.out
。 - 打印出
ls.out
。cat
是最简单的可用程序,允许你打印出一个文件,没有更多了。尽管如此简单,但在构建复杂管道时非常有用。 - 打印出
ls.out
,将所有的bash
条目替换为I replace this!!!
。sed
是一个强大的流编辑器,它非常非常非常有用。
阅读全文
0 0
- 练习 8:更多的重定向和过滤:head,tail,awk,grep,sed
- awk,sed,grep,cut,uniq,sort,tr,wc,head,tail的常见用法
- grep,sed,awk练习
- grep、sed和awk
- grep sed 和 awk
- grep sed awk实例练习
- grep sed awk实例练习
- grep,sed,awk命令练习
- grep sed awk实例练习
- awk 中 对于tail f 的文件重定向
- (管道| / 重定向> / xargs)/find 与xargs结合使用/vi,grep,sed,awk(支持正则表达式的工具程序)
- shell练习三:grep&sed&awk练习
- 过滤工具grep | egrep|awk|sed
- cat、tail、head、grep、sed查看文件任意几行的数据
- cat、tail、head、grep、sed查看文件任意几行的数据
- 【Linux】cat、tail、head、grep、sed查看文件任意几行的数据
- Linux常用命令head,tail,grep,sed,yum,find
- cat、tail、head、tee、grep、wc、sort文件操作和过滤
- char 判断字符是否为大小写
- HTTPOXY漏洞说明
- H264 NAL_AUD
- mybatis源码解析
- 排序算法
- 练习 8:更多的重定向和过滤:head,tail,awk,grep,sed
- 基于PHP+redis的秒杀系统
- 关于网络协议的一点学习
- Activity的生命周期
- HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP
- 从零开始用android studio
- krpano的调试
- ListView CheckBox多选
- 阿里云OS快速入门<上传本地图片>