截取文档中的某段 awk -F ':' '{print $1}' 1.txt 也可以使用自定义字符连接每个段 awk -F':' '{print $1"#"$2"#"$3"#"$4}' 1.txt 匹配字符或字符串 awk '/oo/' 1.txt 针对某个段匹配 awk -F ':' '$1 ~/oo/' 1.txt 多次匹配 awk -F ':' '/root/ {print $1,$3}; $1 ~/test/; $3 ~/20/' 1.txt 条件操作符==, >,<,!=,>=;<=
awk -F ':' '$3=="0"' 1.txt; awk -F ':' '$3>="500"' 1.txt; awk -F ':' '$7!="/sbin/nologin"' 1.txt; awk -F ':' '$3<$4' 1.txt ; awk -F ':' '$3>"5" && $3<"7"' 1.txt awk -F ':' '$3>"5" || $7=="/bin/bash"' 1.txt awk内置变量 NF(段数) NR(行数) head -n3 1.txt | awk -F ':' '{print NF}' head -n3 1.txt | awk -F ':' '{print $NF}' head -n3 1.txt | awk -F ':' '{print NR}' 打印20行以后的行awk 'NR>20' 1.txt awk -F ':' 'NR>20 && $1 ~ /ssh/' 1.txt 更改某个段的值awk -F ':' '$1="root"' 1.txt 数学计算, 把第三段和第四段值相加,并赋予第七段 awk -F ':' '{$7=$3+$4; print $0}' 1.txt 计算第三段的总和 awk -F ':' '{(tot=tot+$3)}; END {print tot}' 1.txt awk中也可以使用if关键词 awk -F ':' '{if ($1=="root") print $0}' 1.txt

精准匹配 精准打印 awk -v 传递参数 awk a=$4 linux中awk下 gsub函数用法

gsub函数则使得在所有正则表达式被匹配的时候都发生替换

gsub(regular expression, subsitution string, target string);简称 gsub(r,s,t)

一、遇到的问题: 问题:echo "a b c 2011-11-22 a:d" | awk '$4=gsub(/-/,"",$4)'为啥 输出后 2011-11-22 变成 2 了? 解答: gsub(/-/,"",$4)的值是2【在赋值的情况下是这样的~】,你将2赋值给$4 ,gsub返回的是替换的次数。 如下是测试结果: [root@Test230 ~]# echo "a b c 2011-11-22 a:d" | awk '$4=gsub(/-/,"",$4)' a b c 2 a:d 看另一种情况,只是替换的话~ [root@sor-sys config]# echo "a b c 2011-11-22 a:d" | awk 'gsub(/-/,"",$4)' a b c 20111122 a:d [root@sor-sys config]# echo "a b c 2011-11-22 a:d" | awk 'gsub(/-/,"_",$4)' a b c 2011_11_22 a:d

二。实例详解 下面我们来总结一下这个gsub的用法: 有一个文本文件data.test的内容如下: 0001|20081223efskjfdj|EREADFASDLKJCV 0002|20081208djfksdaa|JDKFJALSDJFsddf 0003|20081208efskjfdj|EREADFASDLKJCV 0004|20081211djfksdaa1234|JDKFJALSDJFsddf 以'|'为分隔, 现要将第二个域字母前的数字去掉,其他地方都不变, 输出为: 0001|efskjfdj|EREADFASDLKJCV 0002|djfksdaa|JDKFJALSDJFsddf 0003|efskjfdj|EREADFASDLKJCV 0004|djfksdaa1234|JDKFJALSDJFsddf

解法:

awk -F '|' 'BEGIN{ OFS="|" } {sub(/[0-9]+/,"",$2);print $0}' data.test

awk -F '|' -v OFS='|' '{sub(/[0-9]+/,"",$2);print $0}' data.test

三。sub和gsub的区别 sub匹配第一次出现的符合模式的字符串,相当于 sed 's//' 。 gsub匹配所有的符合模式的字符串,相当于 sed 's//g' 。 例如: awk '{sub(/Mac/,"Macintosh");print}' urfile 用Macintosh替换Mac awk '{sub(/Mac/,"MacIntosh",$1); print}' file 第一个域内用 Macintosh替换Mac 把上面sub换成gsub就表示在满足条件得域里面替换所有的字符。

awk的sub函数用法: sub函数匹配指定域/记录中最大、最靠左边的子字符串的正则表达式,并 用替换字符串替换这些字符串。 如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配 的时候。格式如下: sub (regular expression, substitution string): sub (regular expression, substitution string, target string) 实例: $ awk '{ sub(/test/, "mytest"); print }' testfile $ awk '{ sub(/test/, "mytest", $1); print }' testfile 第一个例子在整个记录中匹配,替换只发生在第一次匹配发生的时候。 第二个例子在整个记录的第一个域中进行匹配,替换只发生在第一次匹配 发生的时候。 如要在整个文件中进行匹配需要用到gsub gsub函数作用如sub,但它在整个文档中进行匹配。格式如下: gsub (regular expression, substitution string) gsub (regular expression, substitution string, target string) 实例: $ awk '{ gsub(/test/, "mytest"); print }' testfile $ awk '{ gsub(/test/, "mytest", $1); print }' testfile 第一个例子在整个文档中匹配test,匹配的都被替换成mytest。 第二个例子在整个文档的第一个域中匹配,所有匹配的都被替换成mytest 。 另外, 只有当记录中的域有改变的时候 ,指定0FS变量才有用, 如果记 录中的域无变化, 指定OFS产生不了实际效果。

awk -F'|' -v OFS='|' '{ gsub(/[0-9]/, "", $3); print $0; }' data.txt

将把第三个域中所有数字都去掉。

另外,对于数字的匹配,可以使用十六进制。

awk -F'|' -v OFS='|' '{ gsub(/[/x30-/x39]/, "", $3); print $0; }'

data.txt

str="abcdefg" 要截取c和f之间的字符串,得到de。 可以用split函数,以c和f为分隔符,将字符串分割,取分割后的第二个字段。 echo "$str" | awk '{split($0,a,"[cf]");print a[2]}'