登录 |  注册 |  繁體中文


Linux  wc sort uniq grep awk 操作命令

分类: 服务器相关 颜色:橙色 默认  字号: 阅读(742) | 评论(0)

1.统计命令——wc

  统计文件里面有多少单词,多少行,多少字符。

1.1 wc语法

# wc [-lwm]
选项与参数:
-l  :仅列出行;
-w  :仅列出多少字(英文单字);
-m  :多少字符;

1.2 wc使用

#wc /etc/passwd
40   45 1719 /etc/passwd

  40是行数,45是单词数,1719是字节数

  wc的命令比较简单使用,每个参数使用如下:

#wc -l /etc/passwd   #统计行数,在对记录数时,很常用
/etc/passwd       #表示系统有40个账户
#wc -w /etc/passwd  #统计单词出现次数
/etc/passwd
#wc -m /etc/passwd  #统计文件的字节数

2.排序命令——sort

2.1 sort语法:

  sort命令是帮我们依据不同的数据类型进行排序,其语法及常用参数格式:

sort [-bcfMnrtk][源文件][-o 输出文件] 

  补充说明:sort可针对文本文件的内容,以行为单位来排序。

  参数:
-b   忽略每行前面开始出的空格字符。
-c   检查文件是否已经按照顺序排序。
-f   排序时,忽略大小写字母。
-M   将前面3个字母依照月份的缩写进行排序。
-n   依照数值的大小排序。
-o<输出文件>   将排序后的结果存入指定的文件。
-r   以相反的顺序来排序。
-t<分隔字符>   指定排序时所用的栏位分隔字符。
-k  选择以哪个区间进行排序。

2.2 sort的使用

  下面通过几个例子来讲述Sort的使用。

  (1)sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

$ cat seq.txt
banana
apple
pear
orange
$ sort seq.txt
apple
banana
orange
pear

  用户可以保存排序后的文件内容,或把排序后的文件内容输出至打印机。下例中用户把排序后的文件内容保存到名为result的文件中。

$ sort seq.txt > result

  (2)sort的-u选项

  它的作用很简单,就是在输出行中去除重复行。

$ cat seq.txt
banana
apple
pear
orange
pear
$ sort seq.txt
apple
banana
orange
pear
pear
$ sort -u seq.txt
apple
banana
orange
pear

  pear由于重复被-u选项无情的删除了。

  (3)sort的-r选项

  sort默认的排序方式是升序,如果想改成降序,就加个-r就搞定了。

$ cat number.txt
1
3
5
2
4
$ sort number.txt
1
2
3
4
5
$ sort -r number.txt
5
4
3
2
1

  (4)sort的-o选项

  由于sort默认是把结果输出到标准输出,所以需要用重定向才能将结果写入文件,形如sort filename > newfile。

  但是,如果你想把排序结果输出到原文件中,用重定向可就不行了。

$ sort -r number.txt > number.txt
$ cat number.txt
$

  看,竟然将number清空了。就在这个时候,-o选项出现了,它成功的解决了这个问题,让你放心的将结果写入原文件。这或许也是-o比重定向的唯一优势所在。

$ cat number.txt
1
3
5
2
4
$ sort -r number.txt -o number.txt
$ cat number.txt
5
4
3
2
1

  (5) sort的-n选项

  你有没有遇到过10比2小的情况。我反正遇到过。出现这种情况是由于排序程序将这些数字按字符来排序了,排序程序会先比较1和2,显然1小,所以就将10放在2前面喽。这也是sort的一贯作风。我们如果想改变这种现状,就要使用-n选项,来告诉sort,“要以数值来排序”!

$ cat number.txt
1
10
19
11
2
5
$ sort number.txt
1
10
11
19
2
5
$ sort -n number.txt
1
2
5
10
11
19

  (6)sort的-t选项和-k选项

  如果有一个文件的内容是这样:

$ cat facebook.txt
banana:30:5.5
apple:10:2.5
pear:90:2.3
orange:20:3.4

  这个文件有三列,列与列之间用冒号隔开了,第一列表示水果类型,第二列表示水果数量,第三列表示水果价格。那么我想以水果数量来排序,也就是以第二列来排序,如何利用sort实现?幸好,sort提供了-t选项,后面可以设定间隔符。指定了间隔符之后,就可以用-k来指定列数了。

$ sort -n -k 2 -t ‘:’ facebook.txt
apple:10:2.5
orange:20:3.4
banana:30:5.5
pear:90:2.3

  (7) 其他的sort常用选项

  -f 会将小写字母都转换为大写字母来进行比较,亦即忽略大小写

  -c 会检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1

  -C 会检查文件是否已排好序,如果乱序,不输出内容,仅返回1

  -M 会以月份来排序,比如JAN小于FEB等等

  -b 会忽略每一行前面的所有空白部分,从第一个可见字符开始比较。

3.去重命令——uniq

3.1 uniq语法

  uniq命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用。也就是说,为了使uniq起作用,所有的重复行必须是相邻的。

# uniq [-icu]
选项与参数:
-i   :忽略大小写字符的不同;
-c  :进行计数
-u  :只显示唯一的行

3.2 uniq的使用

  testfile的内容如下:

# cat testfile
hello
world
friend
hello
world
hello

  直接删除未经排序的文件,将会发现没有任何行被删除:

#uniq testfile  
hello
world
friend
hello
world
hello

  排序文件,默认是去重:

#cat words | sort |uniq
friend
hello
world

  排序之后删除了重复行,同时在行首位置输出该行重复的次数:

#sort testfile | uniq -c
1 friend
3 hello
2 world

  仅显示存在重复的行,并在行首显示该行重复的次数:

#sort testfile | uniq -dc
3 hello
2 world

  仅显示不重复的行:

#sort testfile | uniq -u
friend 

4.查找命令——grep

4.1 grep语法

  Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

grep [options]

  主要参数
[options]主要参数:
-c:只输出匹配行的计数。
-I:不区分大 小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及 行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
pattern正则表达式主要参数:
: 忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的开始行。
$: 匹配正则表达式的结束行。
<:从匹配正则表达 式的行开始。
>:到匹配正则表达式的行结束。
[ ]:单个字符,如[A]即A符合要求 。
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
。:所有的单个字符。
* :有字符,长度可以为0。

4.2 grep简单使用

  显示所有以d开头的文件中包含 test的行:

$ grep test d*

  显示在aa,bb,cc文件中匹配test的行:

$ grep test aa bb cc

输出匹配行的计数:

 grep -c "48" data.doc   #输出文档中含有48字符的行数

显示匹配行和行数:

grep -n "48" data.doc       #显示所有匹配48的行和行号

显示非匹配的行:

grep -vn "48" data.doc      #输出所有不包含48的行

显示非匹配的行:

grep -vn "48" data.doc      #输出所有不包含48的行

 大小写敏感:

grep -i "ab" data.doc       #输出所有含有ab或Ab的字符串的行

4.3 grep正则表达式的应用 (注意:最好把正则表达式用单引号括起来)

grep [239]. data.doc      #输出所有含有以2,3或9开头的,并且是两个数字的行

  不匹配测试:

grep ^[^48] data.doc      #不匹配行首是48的行

使用扩展模式匹配:

grep -E 219|216 data.doc

  显示所有包含每个字符串至少有5个连续小写字符的字符串的行:

$ grep [a-z]{5} aa

  如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着 另外一个es(1),找到就显示该行。如果用egrep或grep -E,就不用””号进行转义,直接写成’w(es)t.*1′就可以了:

$ grep w(es)t.*1 aa

 

5.强大的文本分析命令——awk

5.1 awk语法  

  awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk {pattern + action} {filenames}

  尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

  awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。

  通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

5.2 awk入门

  假设last -n 5的输出如下:

# last -n 5 # 仅取出前五行
root     pts/1   192.168.1.100  Tue Feb 10 11:21   still logged in
root     pts/1   192.168.1.100  Tue Feb 10 00:46 - 02:28  (01:41)
root     pts/1   192.168.1.100  Mon Feb  9 11:41 - 18:30  (06:48)
dmtsai   pts/1   192.168.1.100  Mon Feb  9 11:41 - 11:41  (00:00)
root     tty1                   Fri Sep  5 14:09 - 14:10  (00:01)

  如果只是显示最近登录的5个帐号:

#last -n 5 | awk  {print $1}
root
root
root
dmtsai
root

 awk工作流程是这样的:读入有 换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,0则表示所有域,1表示第一个域,n表示第n个域。默认域分隔符是"空白键"或"[tab]键",所以1表示登录用户,$3表示登录用户ip,以此类推。

  如果只是显示/etc/passwd的账户:

#cat /etc/passwd |awk  -F :  {print $1}  
root
daemon
bin
sys

  这种是awk+action的示例,每行都会执行action{print $1}。

  -F指定域分隔符为:。

  如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割:

#cat /etc/passwd |awk  -F :  {print $1"	"$7}
root    /bin/bash
daemon  /bin/sh
bin     /bin/sh
sys     /bin/sh

  如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh":

#cat /etc/passwd |awk  -F :  BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}
name,shell
root,/bin/bash
daemon,/bin/sh
bin,/bin/sh
sys,/bin/sh
....
blue,/bin/nosh

  awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,0则表示所有域,1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。
  搜索/etc/passwd有root关键字的所有行:

#awk -F: /root/{print $7} /etc/passwd             
/bin/bash

  这里指定了action{print $7}。




姓 名: *
邮 箱:
内 容: *
验证码: 点击刷新 *   

回到顶部