使用sed linux从行中过滤一些文本

时间:2014-07-30 11:32:32

标签: regex awk sed grep

我在文件中有以下内容:

NAME=ALARMCARDSLOT137 TYPE=2 CLASS=116 SYSPORT=2629 STATE=U ALARM=M APPL=" " CRMPLINK=CHASSIS131 DYNDATA="GL:1,15 ADMN:1 OPER:2 USAG:2 STBY:0 AVAL:0 PROC:0 UKNN:0 INH:0 ALM:20063;1406718801,"

我只想使用sed

过滤掉NAME,SYSPORT和ALM字段

4 个答案:

答案 0 :(得分:1)

尝试使用以下sed命令过滤掉NAME,SYSPORT,ALM字段

$ sed 's/.*\(NAME=[^ ]*\).*\(SYSPORT=[^ ]*\).*\(ALM:[^;]*\).*/\1 \2 \3/g' file
NAME=ALARMCARDSLOT137 SYSPORT=2629 ALM:20063

答案 1 :(得分:1)

为什么不使用grep

grep -oE 'NAME=\S*|SYSPORT=\S*|ALM:[^;]*'

用你的文字测试:

kent$  echo 'NAME=ALARMCARDSLOT137 TYPE=2 CLASS=116 SYSPORT=2629 STATE=U ALARM=M APPL=" " CRMPLINK=CHASSIS131 DYNDATA="GL:1,15 ADMN:1 OPER:2 USAG:2 STBY:0 AVAL:0 PROC:0 UKNN:0 INH:0 ALM:20063;1406718801,"'|grep -oE 'NAME=\S*|SYSPORT=\S*|ALM:[^;]*'
NAME=ALARMCARDSLOT137
SYSPORT=2629
ALM:20063

答案 2 :(得分:1)

这是另一个awk

awk -F" |;" -v RS=" " '/NAME|SYSPORT|ALM/ {print $1}'
NAME=ALARMCARDSLOT137
SYSPORT=2629
ALM:20063

答案 3 :(得分:1)

每当输入文件中有name=value对时,我发现最好首先创建一个数组,将名称映射到值,然后使用您关注的字段名称对数组进行操作。例如:

$ cat tst.awk
function bldN2Varrs(    i, fldarr, fldnr, subarr, subnr, tmp ) {
    for (i=2;i<=NF;i+=2) { gsub(/ /,RS,$i) }

    split($0,fldarr,/[[:blank:]]+/)
    for (fldnr in fldarr) {
        split(fldarr[fldnr],tmp,/=/)
        gsub(RS," ",tmp[2])
        gsub(/^"|"$/,"",tmp[2])
        name2value[tmp[1]] = tmp[2]

        split(tmp[2],subarr,/ /)
        for (subnr in subarr) {
            split(subarr[subnr],tmp,/:/)
            subName2value[tmp[1]] = tmp[2]
        }
    }
}

function prt( fld, subfld ) {
    if (subfld) print fld "/" subfld "=" subName2value[subfld]
    else        print fld            "=" name2value[fld]
}

BEGIN { FS=OFS="\"" }
{
    bldN2Varrs()
    prt("NAME")
    prt("SYSPORT")
    prt("DYNDATA","ALM")
}

$ awk -f tst.awk file
NAME=ALARMCARDSLOT137
SYSPORT=2629
DYNDATA/ALM=20063;1406718801,

如果20063;1406718801,不是ALM字段的理想值,而您只想要一些子部分,只需调整数组构造函数即可满足您的条件。