日落之城

Take it easy,take it easy!

管道命令

      有时候,输出的数据太过繁杂,我们需要进行一些处理才能得到我们需要,这时候需要用到linux的管道命令。管道命令使用的是"|"这个界定符号。

      管道命令不是"连续执行命令",实际上"|"仅仅只能处理经由前面的命令传来的正确信息(stdout),对于stderr没有直接的处理能力,直接忽略。

      每个管道"|"后面接的第一个数据必须是命令,而且此命令必须能够接收stdin的数据(接收前一个命令传来的数据转为stdin),这样的命令才可以称之为管道命令,比如less,more,head,grep等。而 ls,mv等就不是管道命令了。

选取命令cut, grep

      选取命令的作用:将一段数据经过分析后,取出我们想要的。通常分析选取数据是针对行来分析的,而不是整篇进行分析。

cut

      功能:取出某段信息,其处理是以行为单位。

1、通过分隔字符来取出某一段

cut -d '分隔字符' -f [取出第几段]

      举个例子

echo $PATH | cut -d ':' -f 3,5

      意思就是,以":"为分隔符,然后列出第三个和第五个(第一个":"前面的数据算第一个)

2、取出某一段字符范围

cut -c [字符范围]

      这个适合于输出数据是整齐的格式,比如说:export的输出数据是:

declare -x ****AAIIOA

declare -x ****A)A)

declare -x ****A)A)

declare -x *****(*(

      若是我们不想要前面的那些共同信息,可以这样做

export | cut -c 12-

      就是所有的行都是取出从第12个字符开始以后的数据。字符范围也可以是12-20这样的具体范围。

      不过cut在处理多空格相连的情况时,会不太方便。

grep

      功能:grep的作用是对数据进行一行行的分析,若是当中有我们需要的信息,就将该行整个都拿出来。

grep [-acinv] [--color=auto] '查找的字符串' [file or stdin]

      -a:将binary文件以text文件的方式来查找数据;

      -c:计算找到'查找的字符串'的次数;

      -i:忽略大小写的不同;

      -n:顺便输出行号;

      -v:反向选择,显示不含有"查找的字符串"的那些行;

      --color=auto:将找到的关键字部分加以颜色显示。

      举例说明如下:

ls -al | grep 'root'

grep --color=auto 'openvswitch' /home/gavinzh/openwrt/Makefile

      第一行是用作管道命令;第二行是直接作用于文件来寻找关键字。

排序命令sort、uniq、wc

      排序命令可以对数据进行排序,统计。

sort

      功能:可以排序,而且可以根据不同的数据类型来进行排序(比如说按照数字来排、按照文字来排)。

sort [-fbMnrtuk] [file or stdin]

      -f:忽略大小写不同;

      -b:忽略最前面的空格部分;

      -M:以月份的名字来排序(DEC,JAN等);

      -n:使用“纯数字”来排序(默认是文字类型来排序);

      -r:反向排序;

      -u:就是uniq,相同的数据中仅出现一行;

      -t:分隔符,默认是以tab来分隔

      -k:与-t搭配使用,分隔完后以"第几个区间"来进行排序。

      举个例子:

cat /etc/passwd | sort

cat /etc/passwd | sort -t ':' -k 3 -n

      第一行默认就是以第一个数据来排序,而且是以文字的方式来排序。

      第二行中以":"分隔后,以第三区间来排序,由于默认是以文字类型来排序,所以加个 -n 参数来实现以数字方式来排序。

uniq

      功能:其作用和sort的-c参数相同,是要将重复的数据仅列出一个来显示。

uniq [-ic]

      -i:忽略大小写的不同。

      -c:进行计数。

      举个例子:

last | cut -d ' ' -f 1 | sort | uniq -c

      last来查看这个月登陆主机的用户,经过cut后只显示用户名,然后sort进行排序,最后uniq去掉重复的数据(连续的几个重复的,而不是所有的里面所有的重复的),并对每个登录用户的次数进行统计。

      由于uniq只是对连续的几个重复的才可以进行删除重复,所以我们要做的一般是先排序,再进行uniq。

wc

      功能:统计文件或者输入流有多少字,多少行,多少字符。

wc [-lwm] [file or stdin]

      -l:统计多少行;

      -w:统计多少字(英文单字);

      -m:统计多少字符。

      举个例子:

cat /etc/config network | wc

last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l

      第一行默认是输出行数、字数、字符数。

      第二行由于last会输出空白行和wtmp行,所以用grep依次过滤,最后统计一下行数,就可以知道这一个月内登陆这个系统的总人数。

双向重定向tee

      不同于之前的重定向,tee命令可以实现在数据流输向屏幕的同时,也输出到文件或设备中。

 

tee [-a] filename

      -a:以追加的方式,将数据写入filename中。

      举个例子:

last | tee last.list | cut -d " " -f 1

     将last的输出先存到last.list中一份,然后再做处理后在屏幕显示。

切割命令split

      split命令可以将一个大文件依据大小或者行数来进行切割,弄成小文件;

split [-bl] file PREFIX

      -b:按照大小来切割时,就接个b参数,后面跟b, k, m等;

      -l:以行数来进行切割;

      PREFIX:代表前导符,可作为切割文件的前导文字。

      举个例子:

split -b 300k /etc/passwd passwd

      切完之后,目录下就有几个passwdaa、passwdbb、passwdcc。前导是我们加的,aa、bb、cc是系统加的。

cat passwd* >> passwdback

      利用数据流重定向就可以实现将几个文件来合成为一个文件。

ls -al / |split -l 10 - gavinzh

      后边的那个"-"就是代表stdin,若是需要stdout /stdin时,但偏偏没有文件,就可以用"-"来代表stdin或stdout。之前的grep中可以省略"-",原因是其[file]是作为最后一个参数,默认都是前面的stdout作为stdin来进行处理。

      关于这个"-"符号,再来看一个例子:

tar -cvf - /home | tar -xvf -

      前一个命令的stdout作为下一个命令的stdin,而且这些命令需要用到文件名的时候,stdin和stdout可以用"-"来替代。

      -cvf后面的那个 "-" 就代表压缩的输出流stdout(没有记录到文件,但是理解的时候可以视作把/home压缩后的一个压缩包文件名),后面的-xvf之后的 "-" 就代表前面的输出流作为这次的输入流stdin(理解的时候可以视作之前的压缩包文件名)。这样就不需要使用文件(文件名)了。

参数代换xargs

      xargs可以读入stdin的数据,以空格或者断行符来进行分辨,最终将stdin数据分隔成arguments,传给某个命令。

xargs [-epn] cmd

      -e:就是eof(end of file)的意思,后边可以接一个字符串,当xargs分析到这个字符串就会不会往下工作;

      -p:执行每个命令时,询问用户的意思;

      -n:接次数,每次cmd执行的时候,使用几个参数。

      举个例子:

cd /home/gavinzh; ls | sort | head -n 3 | xargs ls -al 

      首先ls一下并进行排序,取出前三行,然后把这前三个作为参数传入ls -al命令。

cd /home/gavinzh; ls | sort | xargs -n 3 -p ls -al 

      这行命令中,我们每次传入ls -al 3个参数,并询问用户是否确定操作。

      若是用到-e 参数,我们需要的是-e紧接着字符串,中间不能有空格。

      xargs的一个作用就是,有许多命令并不是管道命令(不能接收stdin的数据直接处理),所以通过xargs可以提取stdin中的关键信息作为参数,传入这些非管道命令中。例如上面的 ls 本身就不是管道命令,通过xargs就可以传入参数。









评论