文章目录
1、插入几个新字段:
在"a b c d"的 b 后面插入3个字段 e f g。
[root@localhost ~]# echo "a b c d" | awk '{$2=$2" e f g ";print}'
a b e f g c d
2、格式化空白:
移除每行的前缀、后缀空白,并将各部分左对齐。
#法一:
[root@localhost ~]# awk '{$1=$1;print}' 2.awk
aaa bbb ccc
bbb aaa ccc
ddd fff eee ggg hh jj
#法二:
[root@localhost ~]# awk 'BEGIN{OFS="\t"}{$1=$1;print}' 2.awk
aaa bbb ccc
bbb aaa ccc
ddd fff eee ggg hh jj
3、筛选IPV4地址:
从ifconfig命令的结果中筛选出除了lo网卡外的所有IPv4地址。
特殊的RS值用来解决特殊读取需求:
- RS="”: 按段落读取;
- RS="\0”: 一次性读取所有数据,但有些特殊文件中包含了空字符 \00RS="~s”:真正的一次性读取所有数据,因为非空文件不可能匹配成功;
- RS="n+”: 按行读取,但忽略所有空行;
FS为输入分割符;
#法一:(按照行取值)
[root@localhost ~]# ifconfig | awk '/inet /&& !($2 ~ /^127/){print $2}'
192.168.40.141
192.168.122.1
#法二:(按照段落取值)
[root@localhost ~]# ifconfig | awk 'BEGIN{RS=""}!/lo/{print $6}'
192.168.40.141
192.168.122.1
#法三:(划分每行找第二个元素)
[root@localhost ~]# ifconfig | awk 'BEGIN{RS="";FS="\n"}!/lo/{$0=$2;FS=" ";$0=$0;print $2}'
192.168.40.141
( 改变分隔符之后必须用$0=$0重新赋值,才可以打印)
4、读取.ini配置文件中的某段:
[root@localhost ~]# cat 1.awk
BWGIN{
RS=""} #按段落
/\[mysql\]/{
print;
while((getline)>0){
if(/\[.*\]/){
exit
}
print
}
}
[root@localhost ~]# awk -f 1.awk dem1.txt
[mysql]
name=mysql_repo
baseurl=https://xxx/mysql-repo/yum/mysql-5.7-community/el/$releasever/$basearch
gpgcheck=0
enable=1
上代码,利用 -f 选项 利用 awk 规则文件做筛选;读取到所需要的标签继续往下读取,直到遇到不需要的标签就暂停读取直接打印;
5、根据某字段去重:
去掉uid=xxx重复的行。
首先利用uid去重,我们需要利用 ? 进行划分,然后将uid=xxx保存在数组中,这是判断重复的依据;
然后统计uid出现次数,第一次出现统计,第二次不统计;
[root@localhost ~