Linux的数据处理---------之 cut, awk

高级文本处理命令 cut

cut:一个选取命令,将一段数据经过分析,取出我们想要的数据。一般来说,选取的数据通常是针对行来进行分析的,并不是整篇数据一起分析

语法 :
cut -nb 文件名
cut -c 文件名
cut -df 文件名
cut命令从文件中每一行剪切字节、字符和字段并将这些字节、字符和字段输出到标准输出。
如果不指定file参数,cut命令将读取标准输入。
注意:必须指定-b 或者 -c 或者-f 之一
-d :表示自定义分隔符,默认是制表符。与-f一起使用
-f :依据-d分割字符将一段信息分成多个字段,用-f 表示取出第几个字段
-c :以字符为单位取出固定的字符区间
-b : 以字节为单位取出固定的字节区间
-n :表示取消分割多字节字符。只与-b一起使用;如果字符的最后一个字节,落在了-b标志的参数范围内,那就会取出,否则将抛弃该字节字符

三种定位方式
字节 bytes —— b
字符 char —— c
字段 fileds —-f(域)

栗子:写一个文件1.avi touch 1.avi
往里面写入内容 cat <<EOF > cls.avi(/手动滑稽)

苍老师是个好老师
喜欢中国文化
爱好写大字

cut -nb 3-5 cls.avi   

输出:   苍
       喜
       爱
cut -c 3- cls.avi
输出:  师是个

域: 字段分割
echo $PATH | cut -d ':' -f 2

echo $PATH | cut -d ':' -f 3-

echo $PATH | cut -d ':' -f 1,7

echo $PATH | cut -d ':' -f 7,1
注意:分隔符只能是一个字符,或者空格,如果分割符是多个字符或字节,cut无效

数据处理之awk

awk 的使用方法很简单
awk的3种调用方式
1.命令行
格式为 awk [-F fileds -separator] '命令' 要操作的文件'\

2.shell 脚本方式
将所有的AWK命令写入一个文件中,并使AWK脚本可执行,然后awk命令解析器作为脚本的首行,以便通过
awk脚本来调用,相当于shell脚本首行的#bin/bash

3.文件
将所有的AWK命令插入一个单独的文件,然后调用awk -f + awk脚本 input-files
-f 表示加载的awk的脚本文件
awk -f awk.sh /root/multi.data

栗子:

1.输出文件的每一行:
awk '{print $0}' ./employee.txt

2.输出/etc/passwd第一个字段
 awk  -F ":" '{print $1}' /etc/passwd

3.打印文件的全部内容
awk '{print $0}' employee.txt

4.抽取文件test中的第一列
awk '{print $1}' employee.txt  
或者
awk -F ' ' '{print $1}' employee.txt 


5.列出所有的用户名和登陆的shell名
awk -F ':' '{print $1,$6}' /etc/passwd

当分隔符为多个符号时,如:
a , b , c , d
a1 , b1 , c1 , d1 
awk -F ' , ' '{print $1,$2}' 文件名


6.打印用户名为root的那一行
awk -F ':' '$1=="root" {print $0}' /etc/passwd
或者
awk -F ':' '$1=="keke" {print $1}' /etc/passwd

说明:$1=="root"和$1=="keke"都是属于判断条件  

awk工作流程是这样的:读入有’\n’换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,0,1表示第一个域,$n表示第n个域。默认域分隔符是”空白键” 或 “[tab]键”。

给输出信息加上表头

awk -F ":" 'BEGIN {print "name\tshell\n--------------------------------"}
{print $1"\t"$6}' /etc/passwd

.给输出信息加上表头和末尾

awk -F : 'BEGIN {print "name\tshell\n--------------------------------"} {print $1"\t"$6} 
END {print "end-of-report"}' /etc/passwd

awk -F ":" 'BEGIN {print"--BEGIN--"} 
           $1=="root" { print $1} 
           END{print"----END------"}' /etc/passwd

awk -F ":" 'BEGIN {print"--BEGIN--"} {if( $1=="root") print $1} 
END{print"----END------"}' /etc/passwd

awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作

正则表达式匹配格式
1)n 2)if(n~正则表示式) print $0

1.打印以root开头的行
awk -F “:” ‘0 ~ /^root/’ /etc/passwd  awk -F: ‘{if(0 ~ /^root/) print $0}’

2.打印以ntp开头并以login结尾的行
awk -F : ‘0 /ntp.login/ ’ /etc/passwd

3.打印包含nobody的行
awk -F : ‘{if(1 /nobody/)print0}’ /etc/passwd

4.打印包含nobody或Nobody的行
awk -F : ‘{if(1 /[Nn]obody/)print0}’ /etc/passwd

精确匹配
打印名字为root的用户在/etc/passwd文件中的记录

awk -F':' '{if($1=="root") print$0}' /etc/passwd
发布了23 篇原创文章 · 获赞 14 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览