首页 > 软件系统 > Linux > bash中的字符截取命令cut和awk
2016
12-16

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转换为大写字母后的副本
最后编辑:
作者:qingheluo
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。