简单的总结一下常用的一些实用的Linux文本操作命令,包括wc(统计)、cut(切分)、sort(排序)、uniq(去重)、grep(查找)、sed(替换、插入、删除)、awk(文本分析)。

1.统计命令——wc

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

1.1 wc语法

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

1.2 wc使用

#wc /etc/passwd
/etc/passwd

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

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

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

2.切分命令——cut

2.1 cut语法

cut  [-bn] [file] 或 cut [-c] [file]  或  cut [-df] [file]

  使用说明
  cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
  如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

  主要参数
  -b :
以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
  -c :以字符为单位进行分割。
  -d :自定义分隔符,默认为制表符。
  -f :与-d一起使用,指定显示哪个区域。
  -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的<br />范围之内,该字符将被写出;否则,该字符将被排除。

2.2 cut一般以什么为依据呢? 也就是说,我怎么告诉cut我想定位到的剪切内容呢?

  cut命令主要是接受三个定位方法:

  第一,字节(bytes),用选项-b

  第二,字符(characters),用选项-c

  第三,域(fields),用选项-f

2.3 以“字节”为单位切分

  举个例子吧,当你执行ps命令时,会输出类似如下的内容:

$ who
rocrocket : -- :
rocrocket pts/ -- : (:0.0)
rocrocket pts/ -- : (:0.0)

  如果我们想提取每一行的第3个字节,就这样:

$ who|cut -b 

  如果“字节”定位中,我想提取第3,第4、第5和第8个字节,怎么办?

  -b支持形如3-5的写法,而且多个定位之间用逗号隔开就成了。看看例子吧:

$ who|cut -b -,
croe
croe
croe

  但有一点要注意,cut命令如果使用了-b选项,那么执行此命令时,cut会先把-b后面所有的定位进行从小到大排序,然后再提取。因此这跟我们书写的顺序没有关系。这个例子就可以说明这个问题:

$ who|cut -b ,-
croe
croe
croe

  还有哪些类似“3-5”这样的小技巧,列举一下吧!

$ who
rocrocket : -- :
rocrocket pts/ -- : (:0.0)
rocrocket pts/ -- : (:0.0)
$ who|cut -b -
roc
roc
roc
$ who|cut -b -
crocket : -- :
crocket pts/ -- : (:0.0)
crocket pts/ -- : (:0.0)

  想必你也看到了,-3表示从第一个字节到第三个字节,而3-表示从第三个字节到行尾。如果你细心,你可以看到这两种情况下,都包括了第三个字节“c”。如果我执行who|cut -b -3,3-,你觉得会如何呢?答案是输出整行,不会出现连续两个重叠的c的。

$ who|cut -b -,-
rocrocket : -- :
rocrocket pts/ -- : (:0.0)
rocrocket pts/ -- : (:0.0)

2.4 以"字符"为单位切分

  下面例子你似曾相识,提取第3,第4,第5和第8个字符:

$ who|cut -c -,
croe
croe
croe

  不过,看着怎么和-b没有什么区别啊?莫非-b和-c作用一样? 其实不然,看似相同,只是因为这个例子举的不好,who输出的都是单字节字符,所以用-b和-c没有区别,如果你提取中文,区别就看出来了,来,看看中文提取的情况:

$ cat cut_ch.txt
星期一
星期二
星期三
星期四
$ cut -b cut_ch.txt




$ cut -c cut_ch.txt



  看到了吧,用-c则会以字符为单位,输出正常;而-b只会傻傻的以字节(8位二进制位)来计算,输出就是乱码。既然提到了这个知识点,就再补充一句,如果你学有余力,就提高一下。当遇到多字节字符时,可以使用-n选项,-n用于告诉cut不要将多字节字符拆开。

$ cat cut_ch.txt |cut -b 




$ cat cut_ch.txt |cut -nb
等价于
$ cat cut_ch.txt |cut -nb ,,



2.5 以"域"为单位切分

  为什么会有“域”的提取呢,因为刚才提到的-b和-c只能在固定格式的文档中提取信息,而对于非固定格式的信息则束手无策。这时候“域”就派上用场了。如果你观察过/etc/passwd文件,你会发现,它并不像who的输出信息那样具有固定格式,而是比较零散的排放。但是,冒号在这个文件的每一行中都起到了非常重要的作用,冒号用来隔开每一个项。

  我们很幸运,cut命令提供了这样的提取方式,具体的说就是设置“间隔符”,再设置“提取第几个域”,就OK了!

  以/etc/passwd的前五行内容为例:

$ cat /etc/passwd|head -n 
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
lp:x:::lp:/var/spool/lpd:/sbin/nologin
$ cat /etc/passwd|head -n |cut -d : -f
root
bin
daemon
adm
lp

  看到了吧,用-d来设置间隔符为冒号,然后用-f来设置我要取的是第一个域,再按回车,所有的用户名就都列出来了!呵呵 有成就感吧!

  当然,在设定-f时,也可以使用例如3-5或者4-类似的格式:

$ cat /etc/passwd|head -n |cut -d : -f ,-
root:::root
bin:::bin
daemon:::daemon
adm:::adm
lp:::lp
$ cat /etc/passwd|head -n |cut -d : -f ,-,

root:::root:/bin/bash
bin:::bin:/sbin/nologin
daemon:::daemon:/sbin/nologin
adm:::adm:/sbin/nologin
lp:::lp:/sbin/nologin
$ cat /etc/passwd|head -n |cut -d : -f -
root:x
bin:x
daemon:x
adm:x
lp:x

2.6 cut的弊端:

  如果遇到空格和制表符时,怎么分辨呢?我觉得有点乱,怎么办?

  有时候制表符确实很难辨认,有一个方法可以看出一段空格到底是由若干个空格组成的还是由一个制表符组成的。

$ cat tab_space.txt
this is tab finish.
this is several space finish.
$ sed -n l tab_space.txt
this is tab\tfinish.$
this is several space finish.$

  看到了吧,如果是制表符(TAB),那么会显示为\t符号,如果是空格,就会原样显示。通过此方法即可以判断制表符和空格了。注意,上面sed -n后面的字符是L的小写字母哦,不要看错。

  我应该在cut -d中用什么符号来设定制表符或空格呢?

  其实cut的-d选项的默认间隔符就是制表符,所以当你就是要使用制表符的时候,完全就可以省略-d选项,而直接用-f来取域就可以了。如果你设定一个空格为间隔符,那么就这样:

$cat tab_space.txt |cut -d ' ' -f 
this
this

  注意,两个单引号之间可确实要有一个空格哦,不能偷懒。而且,你只能在-d后面设置一个空格,可不许设置多个空格,因为cut只允许间隔符是一个字符。

$ cat tab_space.txt |cut -d ' ' -f 
cut: the delimiter must be a single character
Try `cut --help' for more information.

  此外,cut在处理多空格的时候会更麻烦,因为cut只擅长处理“以一个字符间隔”的文本内容。

3.排序命令——sort

3.1 sort语法:

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

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

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

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

3.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

$ sort number.txt

$ sort -r number.txt

  (4)sort的-o选项

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

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

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

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

$ cat number.txt

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

  (5) sort的-n选项

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

$ cat number.txt

$ sort number.txt

$ sort -n number.txt

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

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

$ cat facebook.txt
banana::5.5
apple::2.5
pear::2.3
orange::3.4

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

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

  (7) 其他的sort常用选项

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

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

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

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

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

4.去重命令——uniq

4.1 uniq语法

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

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

4.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
friend
hello
world

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

#sort testfile | uniq -dc
hello
world

  仅显示不重复的行:

#sort testfile | uniq -u
friend

5.查找命令——grep

5.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。

5.2 grep简单使用

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

$ grep 'test' d*

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

$ grep 'test' aa bb cc

  输出匹配行的计数:

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

  显示匹配行和行数:

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

  显示非匹配的行:

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

  显示非匹配的行:

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

  大小写敏感:

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

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

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

  不匹配测试:

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

  使用扩展模式匹配:

grep -E '219|216' data.doc

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

$ grep '[a-z]\{\}' aa

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

$ grep 'w\(es\)t.*\1' aa

6.替换/查找/删除命令——sed

6.1 sed语法

  sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法。sed命令行格式为:

sed [-nefri] ‘command’ 输入文本 

  常用选项:
    -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
        -e∶直接在指令列模式上进行 sed 的动作编辑;
        -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
        -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
        -i∶直接修改读取的档案内容,而不是由萤幕输出。

  常用命令:
        a   ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
        c   ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
        d   ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
     i   ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
    p  ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
    s  ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

6.2 sed的使用

  假设我们有一文件名为ab。

  删除某行:

# sed '1d' ab              #删除第一行
# sed '$d' ab #删除最后一行
# sed '1,2d' ab #删除第一行到第二行
# sed '2,$d' ab #删除第二行到最后一行

  显示某行:

# sed -n '1p' ab           #显示第一行
# sed -n '$p' ab #显示最后一行
# sed -n '1,2p' ab #显示第一行到第二行
# sed -n '2,$p' ab #显示第二行到最后一行

  使用模式进行查询:

# sed -n '/ruby/p' ab    #查询包括关键字ruby所在所有行
# sed -n '/\$/p' ab #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义

  增加一行或多行字符串:

# cat ab
Hello!
ruby is me,welcome to my blog.
end
# sed '1a drink tea' ab #第一行后增加字符串"drink tea"
Hello!
drink tea
ruby is me,welcome to my blog.
end
# sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"
Hello!
drink tea
ruby is me,welcome to my blog.
drink tea
end
drink tea
# sed '1a drink tea\nor coffee' ab #第一行后增加多行,使用换行符\n
Hello!
drink tea
or coffee
ruby is me,welcome to my blog.
end

  代替一行或多行:

# sed '1c Hi' ab                #第一行代替为Hi
Hi
ruby is me,welcome to my blog.
end
# sed '1,2c Hi' ab #第一行到第二行代替为Hi
Hi
end

  替换一行中的某部分
  格式:sed 's/要替换的字符串/新的字符串/g'   (要替换的字符串可以用正则表达式)

# sed -n '/ruby/p' ab | sed 's/ruby/bird/g'    #替换ruby为bird
# sed -n '/ruby/p' ab | sed 's/ruby//g' #删除ruby

   插入:

# sed -i '$a bye' ab         #在文件ab中最后一行直接输入"bye"
# cat ab
  Hello!
  ruby is me,welcome to my blog.
  end
  bye

  删除匹配行:

sed -i '/匹配字符串/d'  filename  (注:若匹配字符串是变量,则需要“”,而不是‘’。记得好像是)

  替换匹配行中的某个字符串:

sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename

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

7.1 awk语法  

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

awk '{pattern + action}' {filenames}

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

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

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

7.2 awk入门

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

# last -n  # 仅取出前五行
root pts/ 192.168.1.100 Tue Feb : still logged in
root pts/ 192.168.1.100 Tue Feb : - : (:)
root pts/ 192.168.1.100 Mon Feb : - : (:)
dmtsai pts/ 192.168.1.100 Mon Feb : - : (:)
root tty1 Fri Sep : - : (:)

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

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

  awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$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"\t"$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}。

7.3 awk进阶

  7.3.1 内置变量

  awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。

ARGC               命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符

  此外,$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。

  统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:

#awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
filename:/etc/passwd,linenumber:,columns:,linecontent:root:x:::root:/root:/bin/bash
filename:/etc/passwd,linenumber:,columns:,linecontent:daemon:x:::daemon:/usr/sbin:/bin/sh
filename:/etc/passwd,linenumber:,columns:,linecontent:bin:x:::bin:/bin:/bin/sh
filename:/etc/passwd,linenumber:,columns:,linecontent:sys:x:::sys:/dev:/bin/sh

  使用printf替代print,可以让代码更加简洁,易读:

#awk  -F ':'  '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
  7.3.2 变量和赋值

  除了awk的内置变量,awk还可以自定义变量。

  下面统计/etc/passwd的账户人数:

#awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd
root:x:::root:/root:/bin/bash
......
user count is

  count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开。

  这里没有初始化count,虽然默认是0,但是妥当的做法还是初始化为0:

#awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user count is ", count}' /etc/passwd
[start]user count is
root:x:::root:/root:/bin/bash
...
[end]user count is
  7.3.3 条件语句

  awk中的条件语句是从C语言中借鉴来的,用法与C语言一致。

  统计某个文件夹下的文件占用的字节数,过滤4096大小的文件(一般都是文件夹):

#ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}'
[end]size is 8.22339 M
  7.3.4 循环语句

  awk中的循环语句同样借鉴于C语言,支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。

  7.3.5 数组

  因为awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)。值和关键字都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现,它们并不是按照你预料的顺序显示出来的。数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。

  显示/etc/passwd的账户:

#awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
root
daemon
bin
sys
sync
games
......

  这里使用for循环遍历数组。

[Linux] Linux常用文本操作命令整理的更多相关文章

  1. Linux常用文本操作命令整理

    阅读目录 1.统计命令——wc 2.切分命令——cut 3.排序命令——sort 4.去重命令——uniq 5.查找命令——grep 6.替换/查找/删除命令——sed 7.强大的文本分析命令——aw ...

  2. Linux系列之文本操作命令

    前言 Linux 有八个常用的文本操作命令:cat.head.tail.nl.grep.sed.more.less.本文介绍它们的区别和简单用法. cat命令 显示文本的最基本命令. cat file ...

  3. 【linux】工作中linux系统常用命令操作整理

    1.Linux如何查看端口 使用lsof(list open files)命令,lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000. 或者使用n ...

  4. linux初学者常用必备命令整理

    Linux命令学习 1.文件&目录处理 ls -a 全部文件 -l 详细信息 -r 递归显示子目录结构 ls -al 相当于 ls -a -l cd ..上级目录 .当前目录 ~家目录 cd ...

  5. linux学习-常用文本处理命令

    1.文本处理命令 (1) tr 转换或删除字符 tr [OPTION]...SET1 SET2 选项: -c 取SET1字符串的补集 -d 删除属于SET1中的字符 -s 把连续重复出现的字符以单独一 ...

  6. Linux学习笔记2——Linux中常用文件目录操作命令

    ls 显示文件和目录列表 -l 列出文件的详细信息 -a 列出当前目录所有文件,包含隐藏文件 mkdir 创建目录 -p 父目录不存在情况下先生成父目录 cd 切换目录 touch 生成一个空文件 e ...

  7. linux下常用文件操作命令

    1.find命令 按内容查找文件 find /home/vpopmail/domains/best-21ixi.jp/bounce/Maildir/new/ -name "*" | ...

  8. Linux系统下Git操作命令整理

    1.显示当前的配置信息 git config --list 2. 创建repo从别的地方获取 git clone git://git.kernel.org/pub/scm/git/git.git 自己 ...

  9. 【转载】Linux中常用操作命令

    说明:开始学习linux系统,为了方便查看,特转载一篇Linux中常用操作命令,转载地址:http://www.cnblogs.com/laov/p/3541414.html 正文: Linux简介及 ...

随机推荐

  1. Java 加解密技术系列文章

    Java 加解密技术系列之 总结 Java 加解密技术系列之 DH Java 加解密技术系列之 RSA Java 加解密技术系列之 PBE Java 加解密技术系列之 AES Java 加解密技术系列 ...

  2. CORS基础要点:关于dataType、contentType、withCredentials

    事实上,面试时我喜欢问跨域,因为多数开发者都知道它并且常用,而我希望能从面试者的回答中知道他在这个问题的深入程度,进一步看看面试者研究问题的思维方式及钻研精神,然而确实难到了很多人,当然这也不是面试通 ...

  3. 用字体在网页中画Icon图标

    第一步,下载.IcoMoon网站选择字体图标并下载,解压后将fonts文件夹放在工程目录下.fonts文件夹内有四种格式的字体文件: 注:由于浏览器对每种字体的支持程度不一致,要想在所有浏览器中都显示 ...

  4. BZOJ3527[ZJOI]力

    无题面神题 原题意: 求所有的Ei=Fi/qi. 题解: qi被除掉了,则原式中的qj可以忽略. 用a[i]表示q[i],用b[j-i]来表示±1/((j-i)^2)(j>i时为正,j<i ...

  5. C#简单的对象交互

    在对象的世界里,一切皆为对象;对象与对象相互独立,互不干涉,但在一定外力的作用下对象开始共同努力 对象交互的实例 电视机大家都有吧,依照万物皆对象的思维模式来看,电视机可以是一个类,然后电视机有一些基 ...

  6. [LeetCode] Zigzag Iterator 之字形迭代器

    Given two 1d vectors, implement an iterator to return their elements alternately. For example, given ...

  7. Asp.net 后台添加CSS、JS、Meta标签

    Asp.net 后台添加CSS.JS.Meta标签的写法,我这里写成函数方便以后使用.如果函数放在页面类中, Page参数也可以不要. 首先导入命名空间 using System.Web.UI.Htm ...

  8. ie6、7、8兼容部分css3

    做法很简单下载一个ie-css3,然后有css3的样式里加入behavior: url(js/ie-css3.htc)就可以了(js/ie-css3.htc是文件地址) <!DOCTYPE ht ...

  9. Linux常用获取进程占用资源情况手段

    测试环境:Ubuntu14.04 1.  获取进程ID号 ps -aux | grep your_process_name 例如: xxx@xxx:~$ ps -e |grep Midlet|awk ...

  10. CCF 201512-4 送货(错误)

    直接用DFS深搜,检查了好久没能发现错误,贴上来以后慢慢看... /* DFS深度优先搜索 Edge保存边 u{v,been} cnt记录走过的街道 如果没有就return ;继续递归 */ #inc ...