awk截取字符命令_bash中的字符截取命令cut和awk

grep也是字符截取命令(本笔记在查找命令中),是从文件中截取符合条件的行,其他常见的字符截取命令还有:

一、cut列提取命令:cut [选项] 文件名

-f m[,n]:指定提取第m列或第m到第n列

-d 分隔符:按照指定的分隔符分隔列(没有此选项默认列之间用TAB制表符)

如:cut -d ":" -f 1,3 /etc/passwd代表用冒号(:)作为分隔符,提取文件passwd中的第一和第三列

该命令一般是和行截取命令grep结合使用的。

一般情况下cut不能使用空格作为分隔符,所以除了以空格作为分隔符的内容之外,都可以使用cut。

二、awk列提取命令,比cut命令复杂但是功能强大,能实现更为复杂的逻辑判断或循环等。

使用方法:awk [options] '[BEGIN {command1}] pattern action [END {command2}]' {filenames}

BEGIN中的command1,会在读入第一行之前执行,并且只执行一次。

pattern是逻辑判断式

action是在符合pattern逻辑判断时所执行的一系列命令。花括号{}用于对一系列指令进行分组

END后面的command2,会在文件所有行都读完之后执行一次

通常,awk是以文件的一行为处理单位的(除非使用RS指定行分隔符)。awk每接收文件的一行,然后执行相应的命令,来处理文本。

awk支持if/else、while、do/while、for、break、continue等流程控制语句

options:

-F:指定列分割符,可以指定多个分隔符,默认使用一个或多个连续的空格或tab作为分隔符

-F ":"表示使用冒号为分隔符

-F "[:;,]"表示使用冒号、分号和逗号为分隔符

-F "[:;]+"表示使用一个多连续的多个冒号或分号为分隔符

BEGIN一般可以做以下事情:

1、指定输入文件列分隔符(FS="[\s\t]+")和行分隔符(RS="\n")

2、指定输出的列分隔符(OFS=" ")和行分隔符(ORS="\n")

3、定义表头

awk -F ':' 'BEGIN{FS=":";OFS="-";print "User","Uid"} $3>100 && $1 ~ /h/ {print $1,$3}' /etc/passwd

4、定义一个参数并赋予初始值(一般需要END {command2}语句配合)

ls -l | awk 'BEGIN {size=0} {size+=$5} END {print "Size is " size}'

定义一个size变量并赋值为0,获取ls的第五列也就是文件大小的列相加,最后用END语句输出目录中文件的总大小

pattern:

~和!~表示正则表达式是否匹配(只给出正则表达式等价于省略了"$0 ~")

==,!= , >=,<=, ,||,&& 用于判断大小、是否相等、逻辑与或

例1:查询用户名包含'h'的用户,打印出用户名和UID

awk -F ':' '$1 ~ /h/ {print "User:"$1 "\t" "UID:"$3}' /etc/passwd

例2:打印用户id大于100的用户名和UID

awk -F ':' '$3>100 {print "User:"$1 "\t" "UID:"$3}' /etc/passwd

例3:打印用户id大于100并且用户名匹配正则的用户名和UID

awk -F ':' '$3>100 && $1 ~ /h/ {print "User:"$1 "\t" "UID:"$3}' /etc/passwd

例4:使用if/else语句:

awk -F ":" '{

if($3>100){

printf("User:%s\tUID:%s\n",$1,$3)

}else{

printf("UID:%s\n",$3)

}

}' /etc/passwd

awk内置变量

ARGC 命令行参数个数

ARGV 命令行参数排列

ENVIRON 支持队列中系统环境变量的使用

FILENAME awk浏览的文件名

FNR 浏览文件的总行数

NR 当前记录所在的行号

NF 当前行共有多少列

FS 输入文件的列分隔符,等价于命令行-F选项

RS 输入文件的行分隔符

OFS 输出内容的列分隔符(print函数中以逗号隔开的参数会用此分隔符分割)

ORS 输出内容的行分隔符

$0 指整行记录。

$1表示第一列,$2表示第二列......以此类推。

$NF表示最后一列,$NF-1表示倒数第2列,$NF-2表示倒数第3列......以此类推

除了awk的内置变量,awk还可以自定义变量

ls -l | awk 'BEGIN {size=0} {size+=$5} END {print "Size is " size}'

awk函数

length(str)返回str中字符的个数

int(num)返回num的整数部分

index(str1, str2)返回str2在str1中的索引,如果不存在就返回0

split(str, arr, separator)使用separator作为分隔符,将str切分为数组保存到arr中,返回数组的元素个数

print(fmt) 根据fmt的格式输出结果(会在每个输出之后自动加入一个换行符)

printf(fmt, args)根据fmt格式化args,并输出结果

sprintf(fmt, args)根据fmp格式化args,并返回格式化后的字符串

substr(str, pos, len)返回str中从pos开始,长度为len个字符的子字符串

tolower(str)返回str转换为小写字母后的副本

toupper(str)返回str转换为大写字母后的副本

最后编辑:2019-07-24作者:qingheluo

这个作者貌似有点懒,什么都没有留下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值