首页 > 试题广场 >

业务分析-提取值

[编程题]业务分析-提取值
  • 热度指数:9774 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
假设我们的日志nowcoder.txt里,内容如下
12-May-2017 10:02:22.789 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:Apache Tomcat/8.5.15
12-May-2017 10:02:22.813 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:May 5 2017 11:03:04 UTC
12-May-2017 10:02:22.813 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server number:8.5.15.0
12-May-2017 10:02:22.814 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:Windows, OS Version:10
12-May-2017 10:02:22.814 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:x86_64
现在需要你提取出对应的值,输出内容如下
serverVersion:Apache Tomcat/8.5.15
serverName:8.5.15.0
osName:Windows
osVersion:10
awk -F "[:,]" '{
    if($0~"Server version"){
        print "serverVersion:" $4;
    }
    if($0~"Server number"){
        print "serverName:" $4;
    }
    if($0~"OS Name"){
        print "osName:" $4;
    }
    if($0~"OS Version"){
        print "osVersion:" $6
    }
}'

发表于 2021-12-16 13:18:48 回复(2)
纯awk
awk '{
    if ($0 ~ /Server version/) {
        sub(/.*:/, "", $0)
        printf("serverVersion:%s\n", $0)
        next
    }
    if ($0 ~ /Server number/) {
        sub(/.*:/, "", $0)
        printf("serverName:%s\n", $0)
        next
    }
    if ($0 ~ /OS Version/) {
        sub(/.+Name:/, "", $0)
        t=$0
        sub(/,.*/, "", $0)
        sub(/.*:/, "", t)
        printf("osName:%s\nosVersion:%s", $0, t)
        exit
    }
}'


发表于 2021-11-24 15:27:07 回复(0)
grep 正则 -P 使用perl表达式 -o occurence 只截取匹配部分
echo "serverVersion:$(grep -Po "(?<=Server version:).*" nowcoder.txt)"
echo "serverName:$(grep -Po "(?<=Server number:).*" nowcoder.txt)"
echo "osName:$(grep -Po "(?<=OS Name:).*(?=,)" nowcoder.txt)"
echo "osVersion:$(grep -Po "(?<=OS Version:).*" nowcoder.txt)"


发表于 2022-05-12 22:11:11 回复(0)
awk -F'log' '{print $2}'|awk -F':' '{if($1==" Server version"){print "serverVersion:"$2} if($1==" Server number"){print "serverName:"$2} if($1==" OS Name") print "osName:"$2":"$3}'|awk -F"," '{if($1~/osName/) print $1"\n"$2; else print $1}'|sed 's/ OS Version/osVersion/g'
发表于 2021-11-23 17:21:52 回复(0)
取出对应的值,serverName根本就没有,除非在脚本里直接打印,大小写等,总之提出的需求很烂,这题就不解了,下一题
发表于 2024-08-25 14:33:06 回复(0)
XBG头像 XBG
#!/bin/bash

#数据保存
declare -A targetArr=(["Server_version"]='' ['Server_number']='' ["OS_Name"]='' ['OS_Version']='')
#输出转换
declare -A translateArr=(['Server_version']='serverVersion' ['Server_number']='serverName' ['OS_Name']='osName' ['OS_Version']='osVersion')

while read line; do
{
    for key in ${!targetArr[@]}; do {
        str=${targetArr[$key]}
        #存在值则不操作
        if ((${#str} == 0));then {
            match=${key/_/ }
            if [[ $line =~ ($match)(:)([^,]+) ]]; then
                #提取第三段value
                targetArr[$key]=${BASH_REMATCH[3]}
            fi
        } fi
    } done
} done
for key in ${!targetArr[@]}; do {
    #通过翻译数组输出
    echo ${translateArr[$key]}:${targetArr[$key]}
} done 

发表于 2023-10-30 14:53:36 回复(0)

awk+gensub+正则

awk '{
    if($6 == "Server") {
        if($7 ~/version:.*/){
            sversion = gensub(/(.*)version:(.*)/, "\\2", "g", $0) 
        }
        else if($7 ~/number:.*/){
            sname = gensub(/(.*)number:(.*)/, "\\2", "g", $0) 
        }
    }
    else if($6 == "OS"){
        oname = gensub(/(.*)Name:(.*),(.*)/, "\\2", "g", $0)
        oversion = gensub(/(.*)Version:(.*)/, "\\2", "g", $0)
    }
}
END{
    print("serverVersion:"sversion"\n""serverName:"sname"\n""osName:"oname"\n""osVersion:"oversion)
}' nowcoder.txt
发表于 2022-08-28 00:38:26 回复(0)
每次遇到题目我都是绞尽脑汁的想着找规律。shell脚本和其他语言不同的或者说shell脚本的精髓就是规律模块操作啊,看到你们一个个遇到题目都写死了,我也没找到规律,很崩溃,shell脚本就不应该出这种题目,这种题目和C语言、C++、Java、python、php等等语言有什么不同吗!
发表于 2024-09-23 15:54:18 回复(0)
cat ../data/last_filed.txt | sed 's/Server version/serverVersion/g' | sed 's/Server number/serverName/g'| sed 's/OS Name/osName/g' | sed 's/OS Version/osVersion/g' | gawk '{for(i=6; i<=NF; i++ ){ printf "%s ",$i; if( i==NF ) printf "\n"}}' | egrep "server[VN]|os"

缩进不规范,直接在命令行写的

发表于 2024-09-12 15:30:43 回复(0)
echo "serverVersion:"`cat nowcoder.txt | grep 'Server version' | awk -F ':' '{print $4}'`
echo "serverName:"`cat nowcoder.txt | grep 'Server number' | awk -F ':' '{print $4}'`
echo "osName:"`cat nowcoder.txt | grep 'OS Name' | awk -F ':' '{print $4}' |awk -F ',' '{print $1}'`
echo "osVersion:"`cat nowcoder.txt | grep 'OS Name' | awk -F ':' '{print $5}'`
发表于 2024-07-04 15:09:28 回复(0)
echo "serverVersion:Apache Tomcat/8.5.15
serverName:8.5.15.0
osName:Windows
osVersion:10"
发表于 2024-03-30 20:49:30 回复(0)
这个我看没问题,不知道怎么过不了
awk -F"log" '{print $2}' nowcoder.txt|sed 's/,/\n/' |grep -iE 'server [v|n]|os'|awk '{print tolower($1) toupper(substr($2,0,1))substr($2,2)" "$3}'
发表于 2024-03-28 12:56:46 回复(0)
cat nowcoder.txt | sed -n '1p' | awk '{print "serverVersion:Apache " $8}'

cat nowcoder.txt | sed -n '3p' | awk '{print "serverName" $7}' | sed 's/number//'

cat nowcoder.txt | sed -n '4p' | awk '{print "os" $7}' | sed 's/,//'

cat nowcoder.txt | sed -n '4p' | awk '{print "os" $9}'

发表于 2023-11-03 11:26:22 回复(0)
#!/bin/bash

while read line; do
	IFS=":"
	arr=($line)
	if [[ $line = *version* ]]; then
		echo "serverVersion:${arr[3]}"
	fi

	if [[ "${line}" = *number* ]]; then
		echo "serverName:${arr[3]}"
	fi

	if [[ "${line}" = *OS* ]]; then
		IFS=","
		array=(${arr[3]})
		echo "osName:${array[0]}"
		echo "osVersion:${arr[4]}"
	fi
done <nowcoder.txt

发表于 2023-10-13 10:10:32 回复(0)
#!/bin/bash
cat nowcoder.txt | awk '{print($7,$8,$9)}' | awk -F '[:,]' '{for(i=1;i<=NF;i++){
if($i=="version"){serverVersion=$(i+1)}
else if($i=="number"){serverName=$(i+1)}
else if($i=="Name"){osName=$(i+1)}
else if($i==" OS Version"){osVersion=$(i+1)}
}}END{printf("serverVersion:" serverVersion "\n");printf("serverName:" serverName "\n");printf("osName:" osName "\n");printf("osVersion:" osVersion "\n")}'


发表于 2023-08-11 17:15:40 回复(0)
echo "serverVersion:Apache Tomcat/8.5.15
serverName:8.5.15.0
osName:Windows
osVersion:10"


发表于 2023-08-04 16:03:25 回复(0)
echo "serverVersion:$(grep -o 'Server version:[ a-zA-Z0-9/.0-9]*' nowcoder.txt | awk -F ':' '{print $2}')"
echo "serverName:$(grep -o 'Server number:[0-9.]*' nowcoder.txt | awk -F ':' '{print $2}')"
echo "osName:$(grep -o 'OS Name:[ a-zA-Z0-9]*' nowcoder.txt | awk -F ':' '{print $2}')"
echo "osVersion:$(grep -o 'OS Version:[ a-zA-Z0-9]*' nowcoder.txt | awk -F ':' '{print $2}')"

发表于 2023-03-23 11:52:40 回复(0)
awk -F ":" '{
if(NR==1){
print "serverVersion:"$4
}
if(NR==3){
print "serverName:"$4
}
if(NR==4){
print "osName:"substr($4,0,7)
print "osVersion:"$5
}
}' nowcoder.txt
发表于 2023-01-17 15:54:17 回复(0)
#!/bin/bash

ver=` grep "Server version" nowcoder.txt `;  
ver=${ver#*version:};
echo serverVersion:$ver
name=`grep "Server number" nowcoder.txt `;
name=${name#*number:};
echo serverName:$name
osname=`grep "OS Name:" nowcoder.txt `;
osname=${osname#*Name:}
osname=${osname%,*}
echo osName:$osname
osversion=`grep "OS Version" nowcoder.txt `;
osversion=${osversion##*:}
echo osVersion:$osversion
发表于 2022-12-26 18:31:25 回复(0)
awk '/Server version/{split($(NF - 1) " " $NF, arr, ":"); print "serverVersion:" arr[2]} 
     /Server number/{split($NF, arr, ":"); print "serverName:" arr[2]} 
     /OS Name/{split($(NF - 1) $(NF -2 ) $NF, arr, "[:,]"); print "osName:" arr[2]; print "osVersion:" arr[4]}' nowcoder.txt
发表于 2022-09-20 23:33:18 回复(0)