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="")
2、指定输出的列分隔符(OFS=" ")和行分隔符(ORS="")
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",$1,$3) }else{ printf("UID:%s",$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转换为大写字母后的副本