Linux学习8之Shell编程--字符截取命令(cut、printf、awk、sed)

一、cut字段提取命令

  语法:cut [选项] 文件名

  选项:-f 列号  :指定提取第几列,如果提取多列,列号中间以逗号隔开

     -d 分隔符  :指定分割列的分隔符,以指定的分隔符来分割列。默认的分隔符为制表符

  如:在文件中指定提取第二列,文档以制表符为分隔符

  

  如:指定提取第二列和第四列 

  

  如:指定某一个符号为分隔符来提取字段信息。指定“:”为分隔符,提取/etc/passwd文件中的字段信息。

  Linux学习8之Shell编程--字符截取命令(cut、printf、awk、sed)_第1张图片

  同时cut命令也有局限性。如果需要提取字段的信息中的分隔符是空格而不是制表符或者一些特殊符号的话,cut命令就不能识别了。

二、printf命令--格式化输出命令

  语法:printf '输出类型输出格式' 输出内容

  输出类型:%ns  :%s代表输出字符串,n是数字指定输出几个字符串

       %ni   :%i代表输出整数,n是数字指定输出几个数字

       %m.nf  :%ff代表输出浮点数,m和n是数字,指定输出数字位数和小数位数。如:%8.3f代表共输出8位数,其中小数有两位小数,6位整数。

  输出格式:\a  :输出警告声音

       \b  :输出退格键

       \n  :换行

       \r  :回车

       \t  :水平输出退格键

       \v    :垂直输出退格键

  如:无格式输出一个字符串,整个字符串全部放在一起输出

  

  如:每输出1个字符串就换行,会把后面的字符串都单独输出

  

  如:没输出两个字符串就换行,可以看到,有几个输出类型,一次性就输出几个字符串

  

  

  如果输出文件的话,并不能直接输出,而是需要借助一些命令,如:

  

三、awk命令

  语法:awk '条件1{动作1} 条件2{动作2}...' 文件名 

  条件:一般使用关系式作为条件,如:

  x>10  判断x变量是否大于10,如果是就执行相应的动作

  动作:动作一般是格式化输出或者流程控制语句等

  需要注意的是,awk命令虽然是列提取的命令,但是它处理数据的时候是先读入一行数据,然后在把这一行数据的每一列都赋值给变量$n,其中$1代表第一列,$2代表第二列,$0代表整个这一行本身。awk命令默认的分隔符是空格和制表符。如果动作前面没有条件,则代表不管什么条件都执行此动作。

   如:打印文件test.txt文件第二列和第四列

  

  如:打印df -h命令执行结果

  

  2. BEGIN命令

  BEGIN在awk命令中占据的是条件位,BEGIN的作用是在所有的数据读取之前,执行BEGIN这个条件后面跟的命令且只执行一次,然后在读取数据执行后面的条件和命令。

  如:在在打印test文件之前输出一段话

  

   3. FS内置变量

  FS内置变量的作用是在awk命令中指定分隔符,一般和BEGIN命令一起使用。

  如:指定“:”为分隔符来截取/etc/passwd文件的内容

  

  如果不是不使用BEGIN,而直接指定分割福的话,由于awk命令会首先读取第一行命令,导致输出的时候会把第一行全部输出,而从第二行开始才会使用“:”分隔符来分割列输出。

  

  4. END命令

  END命令的作用和BEGIN正好相反,在所有的数据都执行完成之后再执行END后面的动作。如:在数据都执行完后,输出一行横线

  

  5. 关系运算符

  awk的条件还可以加上关系运算符来进一步筛选我们需要的数据,如:下面是找出分属在88以上的人。grep -v 的作用是反选,即把带有字母的那一行筛选掉以便使用关系运算符进行比较。

  

四、sed命令

  sed命令是一种几乎包括在所有Unix平台的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。和vi命令相比,sed不光能修改文件,还能配合管道符命令对命令的结果进行修改。

  语法:sed [选项] '[动作]' 文件名 --动作需要用单引号括起来

  选项:

    -n  :一般sed命令的执行结果会把所有的数据都输出到屏幕上,如果加入此选项,则只会把sed命令处理的行输出到屏幕。

    -e  :允许对输入的数据使用多条sed动作编辑。

    -i   :此选项可以用sed的修改结果直接修改读取数据的原文件,而不是由屏幕输出。

  动作:

    a  :追加,在当前行后添加一行或多行。行号可以在a前面用数字指定,添加的数据为多行时,除最后一行外,每行的末尾需要用“\”代表数据还没有结束。

    c  :替换,用c后面的字符串替换原数据行。行号可以在c前面用数字指定,替换的数据为多行时,除最后一行外,每行的末尾需要用“\”代表数据还没有结束。

    i   :插入,在当前行前插入一行或多行。行号可以在i前用数字指定,插入的数据为多行时,除最后一行外,每行的末尾需要用“\”代表数据还没有结束。

    d  :删除,删除指定的行。行号可以在d前面用数字指定,删除多行的话,数字之间用逗号分开。如:2,4d。

    p  :打印,输出指定的行。行号可以在p前面用数字指定,输出多行的话,数字之间用逗号分开。如:2,4p。

    s  :字符串替换,用一个字符串替换另一个字符串。格式为“行范围s/旧字串/新字串/g”。和vim命令中的替换格式类似。

  如:当我们需要输出一个文件的某一行的时候,可以用p动作。当不加-n选项时,系统会把文件整体都输出且需要输出的行输出两遍。

  

  如果需要输出多行,只需要指定以第某行开始,第某行结束,数字中间以逗号隔开。

  

  同时,也是sed命令最主要的作用就是对命令的输出结果进行操作。如,对df -h命令的结果进行操作。

  

  以上是-输出数据,我们也可以对文件或命令输出结果进行删除但不修改原始数据,只做显示用。

  

  我们也可以在行前或者行后插入一些信息。-i代表在行前插入信息,-a代表在行后追加信息。如果插入的信息是多行,每行中末尾可以用“\”表示输入没完成。

  

  

  sed命令还可以进行行替换,用动作c来代表行替换,c前面用数字指定替换行,c后面为替换的内容,动作用单引号括起来。如:最后一行用一串虚线代替了。

  

  上面的行替换只能用来替换整行,如果要替换某一个字段的话,需要用到动作s即字串替换。其格式为:'ns/旧字串/新字串/g',n为数字,用来指定旧字串所在的行。如:把文档中的NAME替换成姓名。

  

  以上只是进行单个动作的操作,如果要进行多个动作操作的话,可以用-e选项,动作之间用分号或者回车符隔开。如:把文档找那个的第一行都替换成中文。

  

  以上操作只能改变输出结果而不能改变原文件,如果需要改变原文件的话可以使用-i选项。

  

 

  

  

  

转载于:https://www.cnblogs.com/anchun7080/p/10316904.html

你可能感兴趣的:(Linux学习8之Shell编程--字符截取命令(cut、printf、awk、sed))