1. cut

cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。

1.基本用法

cut [选项参数] filename

说明:默认分隔符是制表符

2.选项参数说明

表1-55

选项参数

功能

-f (fild)

列号,提取第几列

-d

分隔符,按照指定分隔符分割列(以要切割的文本中的分隔符来切割)

-b

按照字节分割 (可分割单个字符,也可分割多个字符:1-5【一到五个字节】;5-【第五个字节和后面的所有字节】)

3.案例实操

(1)切割每一行第 1-5 个字节

[root@hadoop106 shell]# cut -b 1-5 cut.txt

(2)切割student.txt第一列

[root@hadoop106 ~]# cut -d: -f1 student.txt (这里的分隔符 是文本 student.txt 中的分隔符,以此分隔符切割出第一列)

(3)切割IP地址

ifconfig eth0 | grep "inet addr" | cut -d: -f2 | cut -d" " -f1

2. sed

sed 是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

1. 基本用法

sed [选项参数] ‘command’filename

2. 选项参数说明

表1-56

选项参数

功能

-n

显示经过sed特殊处理的数据

-e

允许多点编辑

-i

直接修改读取的文档内容,而不是由屏幕输出

3. 命令功能描述

表1-57

命令

功能描述

a \

新增, a 的后面可以接字串,在下一行出现

d

删除

c \

把选定的行改为新的文本

i \

插入, i 的后面可以接字串

p

打印

s

替换指定字符

####4. 案例实操

(1)将“hive”这个单词插入到test.txt第二行后(操作第几行,直接在命令前加数字)

sed '2a hive' test.txt

(2)删除test.txt文件所有包含h的行

sed '/h/d' test.txt

(3)将test.txt文件中h替换为H

sed 's/h/H/g' test.txt

‘g’表示global,行内全部替换

(4)将test.txt文件中的第二行删除并将hadoop替换为HADOOOP

sed -e '2d' -e 's/hadoop/HADOOP/g' test.txt

3. awk

   一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

1. 基本用法

awk [选项参数]‘pattern1{action1}pattern2{action2}...’filename

pattern: 表示 AWK 在数据中查找的内容,就是匹配模式(通常都是正则表达式) 用斜杠括起来

action:在找到匹配内容时所执行的一系列命令

[用法参考链接] (https://www.cnblogs.com/ginvip/p/6352157.html)

2. 选项参数说明

表1-55

选项参数

功能

-F

指定输入文件折分隔符

-v

赋值一个用户定义变量

3. 案例实操

(1) 搜索/etc/passwd以root关键字开头的所有行,并输出该行的第7列


`awk -F: '/^root/{print $7}' /etc/passwd    (注:$0:输出所有列)`

说明:只有匹配了patter的行才会执行action

(2) 只显示/etc/passwd的第一列和第七列,以逗号分割,且在所有行前面添加列名user,shell在最后一行添加"hls,/bin/bash"。


`awk -F: 'BEGIN{print"user,shell"} {print $1","$7} END{print "hls,/bin/bash"}'  /etc/passwd`

说明:BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。

(3) 将/etc/passwd文件中的用户id增加指定数值并输出


`awk -F: -va=1 '{print $3+a}' /etc/passwd`

(4) test文件内容为:I am Poe,my qq is 33794712,haha:ni shui a 请输出 ni shui a


`awk  -F '[ ,:]' '{print $9" "$10" "$11}'  test       其中[] 括起来的是多个分隔符`

(5) 将文件 dl_reject_record 中的十几列里的符号 “-” 替换为NULL,输出到 test 文件 (为什么不用sed的替换命令,因为这里需要指定列,需要分隔符切片后处理)


awk 'BEGIN{FS=OFS="\t"} {if ($1=="-") $1=NULL}{if ($2=="-") $2=NULL}{if ($3=="-") $3=NULL}{if ($4=="-") $4=NULL}{if ($5=="-") $5=NULL}{if ($6=="-") $6=NULL}{if ($7=="-") $7=NULL}{if ($8=="-") $8=NULL}{if ($9=="-") $9=NULL}{if ($10=="-") $10=NULL}{if ($11=="-") $11=NULL}{if ($12=="-") $12=NULL}{if ($13=="-") $13=NULL}{if ($14=="-") $14=NULL}{if ($15=="-") $15=NULL}{if ($16=="-") $16=NULL}{if ($17=="-") $17=NULL}{if ($18=="-") $18=NULL}{if ($19=="-") $19=NULL}1' dl_reject_record >test

或 (参考)


awk 'BEGIN{FS=OFS="\t"}{gsub(/-/,"",$7);print $0}{gsub(/-/,"",$8);print $0}{gsub(/-/,"",$9);print $0}{gsub(/-/,"",$10);print $0}{gsub(/-/,"",$11);print $0}{gsub(/-/,"",$12);print $0}{gsub(/-/,"",$13);print $0}{gsub(/-/,"",$15);print $0}{gsub(/-/,"",$17);print $0}{gsub(/-/,"",$18);print $0}' dl_reject_record>test

(6) 使用Linux命令查询file1中空行所在的行号


awk  '/^$/{print NR}'  file1

(7) 计算文件内第二列的和并输出


test 文件内容:

张三  50

李四   60

王五   70


[hls@hadoop102 datas]$ cat chengji.txt | awk -F " " '{sum+=$2} END{print sum}'        (不加‘END’将会输出50,110,180)

180

(8) 脚本检查文件 'test' 是否存在,并输出相应提醒 (中括号要与表达式前后都要有空格)


#!/bin/bash



if [ -f test ]; then

    echo '文件存在'

else

    echo '文件并不存在'

fi

(9) 对文本 'test' 中无序的数字排序,并给出总和


sort -n test|awk '{a+=$1;print $1}END{print a}'

(10) 查找当前文件夹(/home)下所有的文本文件内容中包含有字符 ‘shen’ 的文件名字


grep -r "shen" /home    (待完善)

4. 参数

表1-56

变量

说明

ARGC

命令行参数个数

ARGV

命令行参数排列

FILENAME

文件名

NR

已读的记录数

NF

浏览记录的域的个数

5. 案例实操

(1)统计/etc/passwd:文件名,每行的行号,每行的列数

awk -F: '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF}' /etc/passwd

     (2)切割IP

ifconfig eth0 | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'

常见操作

1.取文本中第2行数据 (文本共三行)

1. sed -n '2p'  filename
2. head -n 2  filename | tail -n 1   (取倒数第二行:tail -n 2  filename | head -n 1)