linux grep,sed和awk常用操作

linux下去除最后一个字符

  • 去除最后一个字符
  • 去除注释和空行
  • 替换文件内容
  • 去重
  • 解析配置文件中的用户
  • sed多条件匹配应用

去除最后一个字符

[root@wz ~]# echo "a,b,c," | sed 's/.$//'
a,b,c
[root@wz ~]# echo "a,b,c," | awk '{print substr($0,0,length($0)-1)}'
a,b,c

去除注释和空行

[root@wz conf]# cat aaa
#test
#     test
     #test

ceee
[root@wz conf]# cat aaa | grep -v '[[:blank:]]#\|^#\|^$'
ceee
#

# 显示过滤注释( # ; 开头) 和空行后信息
[root@wz conf]grep -Ev "^$|^[#;]"

替换文件内容

[root@wz ~]# cat file 
data=__data__
[root@wz ~]# sed -i "s:__data__:100:g" file
[root@wz ~]# cat file 
data=100

去重

[root@manager ~]# cat aaa 
k1 abc
k2 abc
k3 123
k4 mbf
[root@manager ~]# cat aaa | awk '!a[$2]++{printf $2" "}'
abc 123 mbf [root@manager ~]#

Pattern:

!a[$2]++

在awk中,对于未初始化的数组变量,在进行数值运算的时候,会赋予初值0,因此a[$2]=0,++运算符的特性是先取值,后加1,因此Pattern等价于

!0

而0为假,!为去翻,因此整个Pattern最后的结果为1,相当于if(1),Pattern匹配成功,输出当前记录。对于aaa文件,第一条记录的处理方式如此。
当读取到第二条的时候,a[$2]=1,取反后的结果为0,即Pattern为0,Pattern匹配失败,因此不输出这条记录,后续的数据以此类推,最终成功实现去重。

解析配置文件中的用户

文件内容如下

Begin UserGroup
GROUP_NAME       GROUP_MEMBER              USER_SHARES            #GROUP_ADMIN
#ugroup1         (user1 user2 user3 user4) ([user1, 4] [others, 10])   #(user1 user2[full])
#ugroup2         (all)                     ([user3, 10] [others, 15])  #(user3[usershares])
#ugroup3         (ugroup1 user5 user6 user7)     ([user5, 16] [user6, 34] [user7, 15] [ugroup1, 40])  #()
End UserGroup
Begin UserGroup
GROUP_NAME    GROUP_MEMBER      #USER_SHARES # Key words
ugrpastron    (guoh dfbu zmgan ska yoon xingyi xgmeng fyuan bczhu lib lizz maochun wxwang hyang ypli zyyao lizhi behzad ccui jtshen caryon wgg gmxiang qguo hyshan qzheng yhdi zxfeng yyz yluo zhangxian)
ugrpastron1    (dfbu zmgan yoon fyuan bczhu wxwang hyang ypli zyyao ccui caryon yhdi)
ugroup1       (xingyi wgg gmxiang)
ugrpdynamo     (kongdali xys liumin liyuan llg jxcheng qsh rrtang)
ugrphan        (hanwenbiao yangsc)
End UserGroup
Begin UserGroup
GROUP_NAME    GROUP_MEMBER      #USER_SHARES # Key words
lsfadmins     (lsfadmin )
End UserGroup
#Begin UserGroup
#GROUP_NAME    GROUP_MEMBER      #USER_SHARES # Key words
#ugrpastron    (guoh dfbu zmgan ska yoon xingyi xgmeng fyuan bczhu lib lizz maochun wxwang hyang ypli zyyao lizhi behzad ccui jtshen caryon zfsong shao1 shao2)
##ugrpastron1   (dfbu)
#ugrpastron1    (dfbu zmgan yoon fyuan bczhu wxwang hyang ypli zyyao ccui caryon)
#End UserGroup

代码解析

[root@wz ~]# cat file | sed -n '/Begin UserGroup/,/End UserGroup/p' | grep -v '^#' | awk -F "(" '{print $2}' | sed 's/)//g' | sed '/^$/d' | xargs | awk '{for(i=1;i<=NF;i++) {if(!a[$i]++) {printf("%s", $i); if(i != NF) {printf(" ")} else {printf("\n")} } } }'
guoh dfbu zmgan ska yoon xingyi xgmeng fyuan bczhu lib lizz maochun wxwang hyang ypli zyyao lizhi behzad ccui jtshen caryon wgg gmxiang qguo hyshan qzheng yhdi zxfeng yyz yluo zhangxian kongdali xys liumin liyuan llg jxcheng qsh rrtang hanwenbiao yangsc lsfadmin

命令解释:

  • sed -n ‘/Begin UserGroup/,/End UserGroup/p’ : 首先将Begin UserGroup和End UserGroup之间的内容过滤出来。
  • grep -v ‘^#’ : 去除注释。
  • awk -F “(” ‘{print $2}’ | sed ‘s/)//g’ :以( 分割并除去)。
  • xargs : 将换行符替换成空格。
  • awk ‘{for(i=1;i<=NF;i++) {if(!a[$i]++) {printf("%s", $i); if(i != NF) {printf(" “)} else {printf(”\n")} } } }’ :以空格分割去重。

!a[$i]++ 这里有使用到hash数组。将遍历的字符串以key和value都为字符串变量的值存入到hash数组中,然后判断是否存在,如果不存在就打印这个变量,然后打印换行符。

sed多条件匹配应用

sed -e及|使用

#/bin/bash

basePath=$(cd `dirname $0`; pwd)
confFile=${basePath}/../../ng-scheduler.json

hostIP=$1
hostStatus="unavail"
hostStatusOK="ok"

scheduler=`cat ${confFile} | grep -w "select" | \
        awk -F ":" '{print $2}' | sed -e 's/,//g' -e 's/\"\| //g' `
hostName=`cat /etc/hosts | grep -w "$hostIP" | awk '{print $2}'`

if [ -z "$hostName" ]; then
    echo $hostStatus
    exit
fi

if [ "$scheduler" == "slurm" ]; then
    state=`scontrol --oneliner show node $hostName | \
        awk '{ for (i=1;i<=NF;i++) if ($i ~ /^State=/) print $i}' | \
        awk -F= '{print $2}'`
    case "$state" in
        ALLOCATED|ALLOCATED+|COMPLETING|IDLE|MIXED)
            hostStatus=$hostStatusOK
    esac
else
    hostStatus=`lsload $hostName | sed '1d' | awk '{print $2}'`
fi

echo $hostStatus

你可能感兴趣的:(shell编程)