29 字符提取命令 cut、printf、awk、sed

1、cut  提取符合条件的列(grep提取符合条件的行):

-f:列号,提取第几列

-d:分隔符,按照指定的分隔符分隔

例子:test.txt是以下内容

ID      NAME      GENDER    MARK

1          张三           M               80

2          赵四           M               90

3          王五           M               70

【注】:列与列之间一定要是tab不能是空格,如果是空格cut无法正确提取

cut -f   2,3,4   test.txt               //取出第2,3,4列

默认使用的tab作为分隔符,如果要切割/etc/passwd是以“:”作为分隔符,这样就用-d指定2分隔符

cut -d ":" -f 2,3   /etc/passwd



2、printf (严格来说不算字符提取命令,是输出命令,因为awk要用到)

printf  '输出类型输出格式'   输出内容

输出类型:

%ns:输出字符串。n是数字,n是数字指输出几个字符

例子:

printf    %s   1 2 3         //123,输出一个整体

printf    "%s %s %s"   1 2 3       //1   2    3  当成三个元素来输出,%s要用双引号括起来

printf    "%s  %s %s\n"  1 2 3 4 5 6    //  1   2   3

     4   5   6         三个一组

【注】:printf后面不能跟文件名、不能把管道符结果作为它的输出

                         printf     "%s\t   %s\t   %s\t    %s\t    %s\t   %s\t"    $(cat test.txt)


%ni:输出整数。n是数字指输出几个数字

%m.nf:输出浮点数。m和n是数字,指输出的整数位数和小数位数。如%8.2f代表共输出8位数,其中2位是小数,6位是整数

输出格式:

\n:换行

\r:回车,也就是Enter

\t:制表符



3、awk(用能cut就用cut,实在不能用再用awk,类似空格作为分隔符的)

awk   “条件1{动作1}条件2{动作2}.........”   文件名

条件:

一般使用关系表达式作为条件

x>10 判断变量是否大于10

x>=10 大于等于

x<=10 小于等于

动作(Action):

格式化输出

流程语句


3.1 基本使用方法

ID NAME PHP LINUX MYSQL ABERAGE

1 张三 60 70 80 70

2 赵四 65 75 85 75

3 王五 70 80 90 80

例子1:没有条件,直接动作执行输出

awk  '{printf   $2  '\t"   $6}'    test.txt    //printf输出 $2(代表第二列),$6(代表第6列),但是是紧挨着输出,所以中间要加一个制表符用双引号引起来就有格式了

df -h | grep /dev/sda5 | awk '{print $5}' | cut -d "%" -f 1           //获取根分区下使用百分比

例子2:有条件BEGIN

df -h | grep /dev/sda5 | awk 'BEGIN{print "this is a test"}{print $5}' | cut -d "%" -f 1      //在取出第2列与第6列之前先输出this is a test

例子3:指定分隔符FS,需要用到BEGIN

awk 'BEGIN{FS=":"}{print $1 "\t" $6}' /etc/passwd            //如果不加BEGIN,第一行不会处理,因为他会先读一行在去处理,加了BEGIN就不会了

例子4:条件END

awk 'BEGIN{FS=":"}END{print  "this is  end "}{print $1 "\t" $6}' /etc/passwd   //在分割显示完成之后输出this is  end 

例子4:支持>、>=、<=等条件

car test.txt  | grep -v NAME | awk '$6>=87 {print  $2}' 



4、sed:主要用来对数据,选取、替换、删除、新增,与vim不同的是,sed不仅可修修改文件内容,还可以对筛选的数据直接操作最终保存。

选项:

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

-e:允许对输入数据应用多条sed命令编辑

-i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出,直接影响源文件内容

动作:

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


例子1:输出

sed   '2p'  test.txt   //输出了第二行,又输出了整个内容

sed -n  '2p'  test.txt   //加入-n,只输出第2行,一般使用p选项都会使用-n

例子2:删除(只修改屏幕输出的内容,不修改源文件,想要一起修改源文件加-i)

sed  '2,4d'  test.txt         //屏幕显示没有第2行~第4行,源文件内容没有更改,因为这条命令没有加-i,操作的仅仅是输出内容不会删除源文件

sed -i '2,4d'  test.txt    //源文件第2~4行内容也被删除了

例子3 : 添加(只修改屏幕输出的内容,不修改源文件,想要一起修改源文件加-i)

sed '2a   this is a test'  test.txt    //在第二行后一行会添加 this is a test

sed  '2i  this is a test'  test.txt     //在第二行前一行插入  this is a test

例子4:替换(只修改屏幕输出的内容,不修改源文件,想要一起修改源文件加-i)

sed  '2c  this is a test'  test.txt    //将第二行内容替换为 this is a test ,行替换

sed '3s/aa/bb/g' test.txt    //将第三行的aa替换成bb,跟vim一样,但是没有%s,想整篇替换's/aa/bb/g'

例子5:多个sed命令一起执行,例如多个一起替换

sed  -e 's/aa/bb/g;s/vv/mm/g'  test.txt               //将aa替换成bb,vv替换成mm


你可能感兴趣的:(linux,自学linux)