AWK指令详解:
Awk将每个输入行识别成一条记录,而将那一行上的每个单词识别成一个字段
-F 指定分隔符
NF 单行最后一个分段
NR 行数
&& AND 语句两边必须同时匹配为真。
|| O R 语句两边同时或其中一边匹配为真。
! 非 求逆
A R G C 支持命令行中传入a w k脚本的参数个数。
A R G V A R G C的参数排列数组,其中每一元素表示为A R G V [ n ],n为期望访问的命令行参数。
ENVIRON 支持系统设置的环境变量,例如ENVIRON[“EDITOR”] =“Vi”
FILENAME 支持a w k脚本实际操作的输入文件
FNR 支持a w k目前操作的记录数。其变量值小于等于N R。
FS 用来在a w k中设置域分隔符,与命令行中- F选项功能相同。例:F S = ","
NF 支持记录域个数,在记录被读之后再设置。
OFS 允许指定输出域分隔符,缺省为空格。如果想设置为#,写入O F S = " # "。
ORS 为输出记录分隔符,缺省为新行( \ n)
RS 是记录分隔符,缺省为新行( \ n )
gsub( r, s ) 在整个$ 0中用s替代r
gsub( r, s , t ) 在整个t中用s替代r
index( s , t ) 返回s中字符串t的第一位置
length( s ) 返回s长度
match( s , r ) 测试s是否包含匹配r的字符串
split( s , a , f s ) 以fs为分隔符将s分成序列数组a
sprint( f m t , e x p ) 返回经f m t格式化后的e x p
sub( r, s ) 用$ 0中最左边最长的子串代替s
substr( s , p ) 返回字符串s中从p开始的后缀部分
substr( s , p , n ) 返回字符串s中从p开始长度为n的后缀部分
Printf修饰符
- 左对齐
Width 域的步长,用0表示0步长
. prec 最大字符串长度,或小数点右边的位数
%c A S C I I字符
%d 整数
%e 浮点数,科学记数法
%f 浮点数,例如(1 2 3 . 4 4)
%g a w k决定使用哪种浮点数转换e或者f
%o 八进制数
%s 字符串
%x 十六进制数
332104908:13754232156
360565687:15026736523
baoping 2007
360565687:13597572727
100000:13898754555
100000:13898754555
1510121:155554215544:TTTa
Malist
dj121M112d12nmm
1986 2007
mimi
baoping 2007
1986 2009
示例:
awk '/^/' list.txt 匹配包含^的行,即显示全文
awk '/$/' list.txt 匹配包含$的行,即显示全文
awk '/./' list.txt 匹配包含^的行,即显示全文
awk '/.*/' list.txt 匹配包含$的行,即显示全文
awk '{ print $1 }' list.txt 显示list.txt中每行第一串字符串
awk '/M/' list.txt 显示包含字符M所有的行
awk '/M/ { print $1 }' list.txt 显示包含M的行的第一串字符串
awk '/M/ {print "TT",$1}' list.txt 匹配包含M前面添加显示TT空格
awk -F, '{ print $1; print $2}' list.txt 逗号为分隔符,无第二串则换行
awk '{print NF}' list.txt 显示默认分隔符最后一个分段$数置
awk '{print $NF}' list.txt 显示最后一分段的值
awk '{n++}END{print n" line"}' list.txt 统计文本内容行数
awk -F: '{if($2~/15026736523/) print $0}' list.txt 匹配第二域,并显示该记录
awk '$0!~/15026736523/' list.txt 匹配第二域,并显示该记录
awk '$0 ~ /15026736523/ {print $0 }' list.txt 匹配手机号,并显示该记录
awk -F: '$2=="15026736523" {print $0 }' list.txt 精确匹配$2的值
awk -F: '{if($2=="15026736523")print $0}' list.txt 精确匹配$2的值
awk -F: '{if($1 < $2) print $0}' list.txt 判断$1小于$2的记录并print
awk '/[Mm].*/' list.txt 匹配M.*或者m.*
awk -F: '$1 ~ /^…i/ {print $0}'list.txt 匹配第四个字符为i的行并显示
awk -F: '$1 ~ /(360|332)/ {print $0}'list.txt 匹配360和332的行.效果同[]
awk -F: '$1=="360565687" && $2=="15026736523"' list.txt 同时要符合条件,交集
awk -F: '{if ($1~/360/ || $2 ~/150/)print $0}' list.txt 匹配任何一个,并集
awk '{if (NR>0 && $1~/3605656/)print $0}' list.txt 匹配if条件
awk 'BEGIN{var="200"} {if ($1
awk '{if($1=="baoping"){$2=$2+1};print $2}' list.txt 算术运算
awk '{if($1=="baoping") $2="1986";print $2}' list.txt 重新赋值并显示所有$2
awk '{if($1=="baoping") {$2="1986";print $2}}' list.txt 重新赋值并显示单个$2
awk 'BEGIN{print "To"}{if($1<$2) {$2=$2-$1;print $0}}' list.txt 结果1986 23
awk '{(tot+=$2)}; END{print "total number:" tot}' list.txt 计算所有$2列的和
ls -l | awk '/^[^d]/ {print $9"\t"$5} {tot+=$5} END {print "KB:" tot}' 大小和
awk 'gsub(/2007/,2009){print $0}' list.txt 匹配2007改为2009并显示
awk 'BEGIN {print index("150","5")}' 显示2,数位数
awk '$1=="baoping" {print length($1)" "$1}' list.txt 显示结果7 baoping,字符长度
awk '$1=="baoping" {print match($2,"7")}' list.txt 相同字符首位置,本例4
awk 'BEGIN {print split("1#2#3#4",shuzu,"#")}' 结果为数组有4个元素shuzu[]
awk '$1=="1986" sub(/7/,"9",$0)' list.txt
awk -F"[ :]" '{ print $1 }' list.txt 同时使用两个分隔符
awk '$1=="1986" {print substr($2,1,3)}' list.txt 显示匹配的$2从1后3个字符
awk '{print substr($1,3)}' list.txt 显示每行第3字符后的字符
awk 'BEGIN{STR="hello"}END{print substr(STR,4)}' list.txt 从第四位开始即lo
echo "Stand-by" | awk '{print length($0)}' 统计变量字符个数
STR="mydoc.txt"; echo $STR|awk '{print substr($STR,1,5)}' 结果mydoc
awk 'BEGIN {print"\n\May\tDay\n\nMay\t\104\141\171"}'
echo "65" | awk '{printf "%c\n",$0}' 以ASCII码显示65即A
awk 'BEGIN{printf "%c\n",65}' 以ASCII码显示65
awk 'BEGIN{printf "%f\n",999}' 以符点数显示结果999.000000
awk -F"[: ]" '{printf "%-15s %s\n",$1,$2}' list.txt $1与$2分别1 5个字符长度
awk '{if ($1
awk 'BEGIN{QQ=360565687}{if ($1
awk 'BEGIN{FS=":"}{print $1,"\t",$2}' list.txt 此方式必须在begin指定分隔符
awk 'NF!=MAX{print("line "NR" does not "MAX"")}' MAX=2 list.txt 如果域数不等于2则显
awk 'BEGIN {split("123#456#789",my,"#");print my[1]}' 此时my[1]为第一个元素
Awk将每个输入行识别成一条记录,而将那一行上的每个单词识别成一个字段
-F 指定分隔符
NF 单行最后一个分段
NR 行数
&& AND 语句两边必须同时匹配为真。
|| O R 语句两边同时或其中一边匹配为真。
! 非 求逆
A R G C 支持命令行中传入a w k脚本的参数个数。
A R G V A R G C的参数排列数组,其中每一元素表示为A R G V [ n ],n为期望访问的命令行参数。
ENVIRON 支持系统设置的环境变量,例如ENVIRON[“EDITOR”] =“Vi”
FILENAME 支持a w k脚本实际操作的输入文件
FNR 支持a w k目前操作的记录数。其变量值小于等于N R。
FS 用来在a w k中设置域分隔符,与命令行中- F选项功能相同。例:F S = ","
NF 支持记录域个数,在记录被读之后再设置。
OFS 允许指定输出域分隔符,缺省为空格。如果想设置为#,写入O F S = " # "。
ORS 为输出记录分隔符,缺省为新行( \ n)
RS 是记录分隔符,缺省为新行( \ n )
gsub( r, s ) 在整个$ 0中用s替代r
gsub( r, s , t ) 在整个t中用s替代r
index( s , t ) 返回s中字符串t的第一位置
length( s ) 返回s长度
match( s , r ) 测试s是否包含匹配r的字符串
split( s , a , f s ) 以fs为分隔符将s分成序列数组a
sprint( f m t , e x p ) 返回经f m t格式化后的e x p
sub( r, s ) 用$ 0中最左边最长的子串代替s
substr( s , p ) 返回字符串s中从p开始的后缀部分
substr( s , p , n ) 返回字符串s中从p开始长度为n的后缀部分
Printf修饰符
- 左对齐
Width 域的步长,用0表示0步长
. prec 最大字符串长度,或小数点右边的位数
%c A S C I I字符
%d 整数
%e 浮点数,科学记数法
%f 浮点数,例如(1 2 3 . 4 4)
%g a w k决定使用哪种浮点数转换e或者f
%o 八进制数
%s 字符串
%x 十六进制数
332104908:13754232156
360565687:15026736523
baoping 2007
360565687:13597572727
100000:13898754555
100000:13898754555
1510121:155554215544:TTTa
Malist
dj121M112d12nmm
1986 2007
mimi
baoping 2007
1986 2009
示例:
awk '/^/' list.txt 匹配包含^的行,即显示全文
awk '/$/' list.txt 匹配包含$的行,即显示全文
awk '/./' list.txt 匹配包含^的行,即显示全文
awk '/.*/' list.txt 匹配包含$的行,即显示全文
awk '{ print $1 }' list.txt 显示list.txt中每行第一串字符串
awk '/M/' list.txt 显示包含字符M所有的行
awk '/M/ { print $1 }' list.txt 显示包含M的行的第一串字符串
awk '/M/ {print "TT",$1}' list.txt 匹配包含M前面添加显示TT空格
awk -F, '{ print $1; print $2}' list.txt 逗号为分隔符,无第二串则换行
awk '{print NF}' list.txt 显示默认分隔符最后一个分段$数置
awk '{print $NF}' list.txt 显示最后一分段的值
awk '{n++}END{print n" line"}' list.txt 统计文本内容行数
awk -F: '{if($2~/15026736523/) print $0}' list.txt 匹配第二域,并显示该记录
awk '$0!~/15026736523/' list.txt 匹配第二域,并显示该记录
awk '$0 ~ /15026736523/ {print $0 }' list.txt 匹配手机号,并显示该记录
awk -F: '$2=="15026736523" {print $0 }' list.txt 精确匹配$2的值
awk -F: '{if($2=="15026736523")print $0}' list.txt 精确匹配$2的值
awk -F: '{if($1 < $2) print $0}' list.txt 判断$1小于$2的记录并print
awk '/[Mm].*/' list.txt 匹配M.*或者m.*
awk -F: '$1 ~ /^…i/ {print $0}'list.txt 匹配第四个字符为i的行并显示
awk -F: '$1 ~ /(360|332)/ {print $0}'list.txt 匹配360和332的行.效果同[]
awk -F: '$1=="360565687" && $2=="15026736523"' list.txt 同时要符合条件,交集
awk -F: '{if ($1~/360/ || $2 ~/150/)print $0}' list.txt 匹配任何一个,并集
awk '{if (NR>0 && $1~/3605656/)print $0}' list.txt 匹配if条件
awk 'BEGIN{var="200"} {if ($1
awk '{if($1=="baoping"){$2=$2+1};print $2}' list.txt 算术运算
awk '{if($1=="baoping") $2="1986";print $2}' list.txt 重新赋值并显示所有$2
awk '{if($1=="baoping") {$2="1986";print $2}}' list.txt 重新赋值并显示单个$2
awk 'BEGIN{print "To"}{if($1<$2) {$2=$2-$1;print $0}}' list.txt 结果1986 23
awk '{(tot+=$2)}; END{print "total number:" tot}' list.txt 计算所有$2列的和
ls -l | awk '/^[^d]/ {print $9"\t"$5} {tot+=$5} END {print "KB:" tot}' 大小和
awk 'gsub(/2007/,2009){print $0}' list.txt 匹配2007改为2009并显示
awk 'BEGIN {print index("150","5")}' 显示2,数位数
awk '$1=="baoping" {print length($1)" "$1}' list.txt 显示结果7 baoping,字符长度
awk '$1=="baoping" {print match($2,"7")}' list.txt 相同字符首位置,本例4
awk 'BEGIN {print split("1#2#3#4",shuzu,"#")}' 结果为数组有4个元素shuzu[]
awk '$1=="1986" sub(/7/,"9",$0)' list.txt
awk -F"[ :]" '{ print $1 }' list.txt 同时使用两个分隔符
awk '$1=="1986" {print substr($2,1,3)}' list.txt 显示匹配的$2从1后3个字符
awk '{print substr($1,3)}' list.txt 显示每行第3字符后的字符
awk 'BEGIN{STR="hello"}END{print substr(STR,4)}' list.txt 从第四位开始即lo
echo "Stand-by" | awk '{print length($0)}' 统计变量字符个数
STR="mydoc.txt"; echo $STR|awk '{print substr($STR,1,5)}' 结果mydoc
awk 'BEGIN {print"\n\May\tDay\n\nMay\t\104\141\171"}'
echo "65" | awk '{printf "%c\n",$0}' 以ASCII码显示65即A
awk 'BEGIN{printf "%c\n",65}' 以ASCII码显示65
awk 'BEGIN{printf "%f\n",999}' 以符点数显示结果999.000000
awk -F"[: ]" '{printf "%-15s %s\n",$1,$2}' list.txt $1与$2分别1 5个字符长度
awk '{if ($1
awk 'BEGIN{QQ=360565687}{if ($1
awk 'BEGIN{FS=":"}{print $1,"\t",$2}' list.txt 此方式必须在begin指定分隔符
awk 'NF!=MAX{print("line "NR" does not "MAX"")}' MAX=2 list.txt 如果域数不等于2则显
awk 'BEGIN {split("123#456#789",my,"#");print my[1]}' 此时my[1]为第一个元素
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/1875/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
评论列表