Shell过滤器的具体使用

我们己经知道,将几个命令通过管道符组合在一起就形成一个管道。通常,通过这种方式使用的命令就被称为过滤器。过滤器会获取输入,通过某种方式修改其内容,然后将其输出。

简单地说,过滤器可以概括为以下两点:

  • 如果一个 Linux 命令是从标准输入接收它的输入数据,并在标准输出上产生它的输出数据(结果),那么这个命令就被称为过滤器。
  • 过滤器通常与 Linux 管道一起使用。

常用的被作为过滤器使用的命令如下所示:

命令 说明
awk 用于文本处理的解释性程序设计语言,通常被作为数据提取和报告的工具。
cut 用于将每个输入文件(如果没有指定文件则为标准输入)的每行的指定部分输出到标准输出。
grep 用于搜索一个或多个文件中匹配指定模式的行。
tar 用于归档文件的应用程序。
head 用于读取文件的开头部分(默认是 10 行)。如果没有指定文件,则从标准输入读取。
paste 用于合并文件的行。
sed 用于过滤和转换文本的流编辑器。
sort 用于对文本文件的行进行排序。
split 用于将文件分割成块。
strings 用于打印文件中可打印的字符串。
tac 与 cat 命令的功能相反,用于倒序地显示文件或连接文件。
tail 用于显示文件的结尾部分。
tee 用于从标准输入读取内容并写入到标准输出和文件。
tr 用于转换或删除字符。
uniq 用于报告或忽略重复的行。
wc 用于打印文件中的总行数、单词数或字节数。

接下来,我们通过几个实例来演示一下过滤器的使用。

在管道中使用 awk 命令

关于 awk 命令的具体用法,请大家自行学习,本节我们我们仅通过几个简单的实例来了解一下 awk 命令在管道中的使用。

实例1

查看系统中的所有的账号名称,并按名称的字母顺序排序。

[jb51.net]$ awk -F: '{print $1}' /etc/passwd | sort
adm
apache
avahi
avahi-autoipd
bin
daemon
dbus
ftp
games
...

在上例中,使用冒号:作为列分隔符,将文件 /etc/passwd 的内容分为了多列,并打印了第一列的信息(即用户名),然后将输出通过管道发送到了 sort 命令。

实例2

列出当前账号最常使用的 10 个命令。

[jb51.net]$ history | awk '{print $2}' | sort | uniq -c | sort -rn | head
140 echo
 75 man
 71 cat
 63 su
 53 ls
 50 vi
 47 cd
 40 date
 26 let
 25 paste

在上例中,history 命令将输出通过管道发送到 awk 命令,awk 命令默认使用空格作为列分隔符,将 history 的输出分为了两列,并把第二列内容作为输出通过管道发送到了 sort 命令,使用 sort 命令进行排序后,再将输出通过管道发送到了 uniq 命令,使用 uniq 命令 统计了历史命令重复出现的次数,再用 sort 命令将 uniq 命令的输出按照重复次数从高到低排序,最后使用 head 命令默认列出前 10 个的信息。

实例3

显示当前系统的总内存大小,单位为 KB。

[jb51.net]$ free | grep Mem | awk '{print $2}'
2029860

在管道中使用 cut 命令

cut 命令被用于文本处理。你可以使用这个命令来提取文件中指定列的内容。

实例1

查看系统中登录 Shell 是“/bin/bash”的用户名和对应的用户主目录的信息:

[jb51.net]$ grep "bin/bash" /etc/passwd | cut -d: -f1,6
root:/root
mozhiyan:/home/mozhiyan

如果你对 Linux 系统有所了解,你会知道,/ctc/passwd 文件被用来存放用户账号的信息,此文件中的每一行会记录一个账号的信息,每个字段之间用冒号分隔,第一个字段即是账号的账户名,而第六个字段就是账号的主目录的路径。

实例2

查看当前机器的CPU类型。

[jb51.net]$ cat /proc/cpuinfo | grep name | cut -d: -f2 | uniq
Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz

上例中,执行命令cat /proc/cpuinfo | grep name得到的内容如下所示:

[jb51.net]$ cat /proc/cpuinfo | grep name
model name  : Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz
model name  : Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz
model name  : Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz
model name  : Intel(R) Core(TM) i5-2520M CPU 0 2.50GHz

然后,我们使用 cut 命令将上述输出内容以冒号作为分隔符,将内容分为了两列, 并显示第二列的内容,最后使用 uniq 命令去掉了重复的行。

实例3

查看当前目录下的子目录数。

[jb51.net]$ ls -l | cut -c 1 | grep d | wc -l
5

上述管道命令主要做了如下操作:

  • 命令ls -l输出的内容中,每行的第一个字符表示文件的类型,如果第一个字符是d,就表示文件的类型是目录。
  • 命令cut -c 1是截取每行的第一个字符。
  • 命令grep d来获取文件类型是目录的行。
  • 命令wc -l用来获得 grep 命令输出结果的行数,即目录个数。

在管道中使用grep命令

grep 命令是在管道中比较常用的一个命令。

实例1

查看系统日志文件中的错误信息。

[jb51.net]$ grep -i "error:" /var/log/messages | less

实例2

查看系统中 HTTP 服务的进程信息。

[jb51.net]$ ps auxwww | grep httpd
apache 18968 0.0 0.0 26472 10404 ?  S  Dec15  0:01 /usr/sbin/httpd
apache 18969 0.0 0.0 25528 8308 ?  S  Dec15  0:01 /usr/sbin/httpd
apache 18970 0.0 0.0 26596 10524 ?  S  Dec15  0:01 /usr/sbin/httpd

实例3

查找我们的程序列表中所有命令名中包含关键字 zip 的命令。

[jb51.net]$ ls /bin /usr/bin | sort | uniq | grep zip
bunzip2
bzip2
bzip2recover
gunzip
gzip

实例4
查看系统安装的 kernel 版本及相关的 kernel 软件包。

[jb51.net]$ rpm -qa | grep kernel
kernel-2.6.18-92.e15
kernel-debuginfo-2.6.18-92.e15
kernel-debuginfo-common-2.6.18-92.e15
kernel-devel-2.6.18-92.e15

实例5

查找 /etc 目录下所有包含 IP 地址的文件。

[jb51.net]$ find /etc -type f -exec grep '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*' {} \;

在管道中使用 tar 命令

tar 命令是 Linux 系统中最常用的打包文件的程序。

实例1

你可以使用 tar 命令复制一个目录的整体结构。

[jb51.net]$ tar cf - /home/mozhiyan | ( cd /backup/; tar xf - )

实例2
跨网络地复制一个目录的整体结构。

[jb51.net]$ tar cf - /home/mozhiyan | ssh remote_host "( cd /backup/; tar xf - )"

实例3
跨网络地压缩复制一个目录的整体结构。

[jb51.net]$ tar czf - /home/mozhiyan | ssh remote_host "( cd /backup/; tar xzf - )"

实例4
检査 tar 归档文件的大小,单位为字节。

[jb51.net]$ cd /; tar cf - etc | wc -c
215040

实例5
检查 tar 归档文件压缩为 tar.gz 归裆文件后所占的大小。

[jb51.net]$ tar czf - etc.tar | wc -c
58006

实例6
检查 tar 归档文件压缩为 tar.bz2 归裆文件后所占的大小。

[jb51.net]$ tar cjf - etc.tar | wc -c
50708

在管道中使用 head 命令

有时,你不需要一个命令的全部输出,可能只需要命令的前几行输出。这时,就可以使用 head 命令,它只打印命令的前几行输出。默认的输出行数为 10 行。

实例1

显示 ls 命令的前 10 行输出。

[jb51.net]$ ls /usr/bin | head
addftinfo
afmtodit
apropos
arch
ash
awk
base64
basename
bash
bashbug

实例2
显示 ls 命令的前 5 行内容。

[jb51.net]$ ls / | head -n 5
bin
cygdrive
Cygwin.bat
Cygwin.ico
Cygwin-Terminal.ico

在管道中使用 uniq 命令

uniq 命令用于报告或删除重复的行。我们将使用一个测试文件进行管道中使用 uniq 命令的实例讲解,其内容如下所示:

[jb51.net]$ cat testfile
This line occurs only once.
This line occurs twice.
This line occurs twice.
This line occurs three times.
This line occurs three times.
This line occurs three times.

实例1
去掉输出中重复的行。

[jb51.net]$ sort testfile | uniq
This line occurs only once.
This line occurs three times.
This line occurs twice.

实例2
显示输出中各重复的行出现的次数,并按次数多少倒序显示。

[jb51.net]$ sort testfile | uniq -c | sort -nr
3 This line occurs three times.
2 This line occurs twice.
1 This line occurs only once.

在管道中使用 wc 命令

wc 命令用于统计包含在文本流中的字符数、单同数和行数。

实例1
统计当前登录到系统的用户数。

[jb51.net]$ who | wc -l

实例2
统计当前的 Linux 系统中的进程数。

[jb51.net]$ ps -ef | wc -l

到此这篇关于Shell过滤器的具体使用的文章就介绍到这了,更多相关Shell过滤器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • PowerShell中按文件后缀过滤的实现代码

    小编在使用PowerShell时,经常要使用Get-ChildItem(别名为dir),去获取一些文件或目录.然后要对这些结果按文件类型,即文件后缀去进行筛选.很多次这样的工作做下来,小编觉得烦了,有没有简单的.一劳永逸的方法呢?我们今天就来探讨. 不卖关子了,先给一个Filter代码,大家先过目一下: 复制代码 代码如下: Filter Where-Extension {    param    (        [String[]]        $extension = ('.png',

  • Windows Powershell过滤管道结果

    如果要过滤对象可以使用Where-Object:如果要过滤对象的属性,可以使用Select-Object:如果要自定义个性化的过滤效果可以使用ForEach-Object.最后如果想过滤重复的结果,可是使用Get-Uinque. 筛选管道结果中的对象 如果你只对管道结果的特定对象感兴趣,可是使用Where-Object对每个结果进行严格筛选,一旦满足你的标准才会保留,不满足标准的就会自动丢弃.例如你通过Get-service查看运行在机器上的当前服务,但是可能只关心哪些正在运行的服务,这时就可是

  • Windows Powershell Where-Object 条件过滤

    过滤管道结果 使用Get-Process返回所有的当前进程 ,但是你可能并不对所有的进程感兴趣,然后通过每个Process对象的属性进行过滤.首先得知道每个对象支持那些属性. 复制代码 代码如下: PS C:Powershell> Get-Process | select -First 1 | fl * __NounName                 : Process Name                       : AcroRd32 Handles               

  • Shell过滤器的具体使用

    我们己经知道,将几个命令通过管道符组合在一起就形成一个管道.通常,通过这种方式使用的命令就被称为过滤器.过滤器会获取输入,通过某种方式修改其内容,然后将其输出. 简单地说,过滤器可以概括为以下两点: 如果一个 Linux 命令是从标准输入接收它的输入数据,并在标准输出上产生它的输出数据(结果),那么这个命令就被称为过滤器. 过滤器通常与 Linux 管道一起使用. 常用的被作为过滤器使用的命令如下所示: 命令 说明 awk 用于文本处理的解释性程序设计语言,通常被作为数据提取和报告的工具. cu

  • hbase shell基础和常用命令详解

    HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务. 1. 简介 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase

  • YII Framework的filter过滤器用法分析

    本文实例讲述了YII Framework的filter过滤器用法.分享给大家供大家参考,具体如下: 首先看官方给出的说明文档,什么是过滤器,过滤器的作用,过滤器的规则,过滤器的定义方法等等. 然后对过滤器进行一个总结. http://www.yiiframework.com/doc/guide/1.1/zh_cn/basics.controller 过滤器是一段代码,可被配置在控制器动作执行之前或之后执行.例如, 访问控制过滤器将被执行以确保在执行请求的动作之前用户已通过身份验证:性能过滤器可用

  • vue通过过滤器实现数据格式化

    一.本节说明 在使用插值表达式的时候,我们通常会有一种需求,就是将数据进行二次的格式化.VUE的过滤器的实现参考了linux的shell命令的管道的实现原理:即上一个命令的输出,是下一个命令的输入. 所以过滤器可以串接使用:{{数据 | 过滤器A | 过滤器B}} 除了在插值表达式中可以使用过滤器,在后文中将要学习到的v-bind指令中也可以使用过滤器.用法是一致的,到时候我们再看一看. 二. 怎么做 全局过滤器(定义一个用于做日期格式化的过滤器) 过滤器的第一个参数是固定的,就是输入的数据.对

  • 阿里云日志服务日志过滤器配置

    日志收集流程 对于日志收集的客户端,其work pipeline通常包括三个过程:Input,Process,Output. Input: 适配各类日志接入源,目前Logtail支持文本文件.Syslog(TCP流式)两种形式数据写入. Process:自定义日志处理逻辑,常见的有:日志切分.日志编码转换.日志结构化解析.日志过滤等等. Output:定义日志输出,例如Logtail以HTTP协议写数据到日志服务. 今天要介绍Logtail在日志处理阶段的两个新功能:转码.过滤 日志转码 日志服

  • AngularJs学习第八篇 过滤器filter创建

    demo 这是整个示例demo 1.filter.js文件 angular.module("exampleApp", []) .constant("productsUrl", "http://localhost:/products") .controller("defaultCtrl", function ($scope, $http, productsUrl) { $http.get(productsUrl).success

  • shell脚本实现本地文件与服务器文件同步

    为何创建此脚本是因为方便项目的布署,不需要手动地去同步不同的项目,而只需要简单的执行shell脚本,输入项目名就能发布到服器上. 1.shell文件代码 #!/bin/sh read -t 30 -p "请输入项目名:" name echo -e "\n" echo "项目名为:$name" case $name in cn) rsync -r ~/project1 root@192.168.18.2:/project1 --exclude=&q

  • shell脚本无密码登录 expect的使用方法详解

    shell脚本无密码登录 expect的使用方法详解 今天需要做一个定时任务脚本将最新的数据包文件传到远程的服务器上,虽然有密钥但也是要求输入密码的那种,所以只能另想办法实现让脚本自动输入密码了. 从网上查到使用expect可以,简单研究了一下,效果不错. 因为我的操作系统没有安装expect,所以直接"yum -y install expect",你可以根据你的操作系统安装expect,或者源码编译. 安装好之后就可以使用了,这里有几种方法: 一.单独写一个脚本 如 auto_scp

  • 两个很详细的shell 实例代码

    两个很详细的shell 实例 一般编程步骤 现在我们来讨论编写一个脚本的一般步骤.任何优秀的脚本都应该具有帮助和输入参数.并且写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构,是一个非常不错的主意.这时候,在写一个新的脚本时我们只需要执行一下copy命令: cp framework.sh myscript 然后再插入自己的函数. 让我们再看两个例子: 二进制到十进制的转换 脚本 b2d 将二进制数 (比如 1101) 转换为相应的十进制数.这也是一个用expr命令

  • linux shell中 if else以及大于、小于、等于逻辑表达式介绍

    比如比较字符串.判断文件是否存在及是否可读等,通常用"[]"来表示条件测试. 注意:这里的空格很重要.要确保方括号的空格.笔者就曾因为空格缺少或位置不对,而浪费好多宝贵的时间. if ....; then....elif ....; then....else....fi[ -f "somefile" ] :判断是否是一个文件[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限[ -n "$var" ]

随机推荐