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)