构建一个在脚本中使用的解析器(bash)

时间:2015-10-07 14:34:50

标签: bash parsing

我需要通过bash在字符串中发现模式,我想用crontab自动执行。

我有一个包含数据的字符串 180MHz等等。这是一份报告。

我想将字符串掩码定义为常量,并将每个子字符串与我的掩码进行比较。我想我会使用长度和焦点的混合物。

我正在谷歌搜索更好的想法并观看其他一些实现,但我找不到有用的结果。

有什么建议吗? 感谢。

编辑: 一些输入样本

%d/%m/%Y %H:%i aaa bbb ccc 123456 ddd 7890 eee

而作为输出我需要

01/01/2015 06:20 EXAMPLE 2 (001) Foo bar X(12) 
02/01/2015 12:03 EXAMPLE 1 (000) 01234567 Baz bax X(04) 
03/01/2015 10:37 EXAMPLE 1 (000) Bam bac (X:1-16). [ SOMEGUY ] 
04/01/2015 11:04 EXAMPLE 2 (001) 12345678 Baz bax X(12) SOMEACTION 
05/01/2015 12:34 EXAMPLE 2 (001) 45678901 Bim bum X(01) SOMEACTION NAME SURNAME
08/08/2015 19:00 SOMEGUY Bic bac. [ SOMEGUY ] 
01/01/2015 11:34 EXAMPLE 2 (001) 78901234 Gic gia gim X(01)

Edit2:我忘了说我用这个

循环这些行
variabile $date $time $example $codeline $action $message $name $surname

4 个答案:

答案 0 :(得分:1)

使用typedef struct TEST{ int testInt[5]; }; TEST* myVarTest = new TEST(); 格式化字符串:

date

如果这就是你的意思。

或者使用$ date +"%d/%m/%Y %H:%m aaa bbb ccc 123456 ddd 7890 eee" 09/10/2015 14:10 aaa bbb ccc 123456 ddd 7890 eee ,例如:

printf

或创建等效的printf "%s/%s/%s %s:%s aa bb cc" 2015 01 01 00 00 函数:

sprintf

如果您想以其他方式阅读,请使用sprintf() { local stdin; read -d '' -u 0 stdin; printf "$@" "$stdin"; } ,例如:

read

有关更多示例,请参阅:How do I split a string on a delimiter in Bash?

答案 1 :(得分:1)

可能是一个比你需要的更复杂的aplroach。但是你会以同样的方式......所以:

您是否听说过用于识别图像的机器学习技术?他们实际上使用了许多不同的面具(在你的情况下是一个字符串面具),你需要随机选择,然后在分析时纠正stocasticaly。将带有字符串和sum字符值的掩码与XOR进行异或。您将获得每个掩码的编号,并且您将实际生成一个哈希,告诉您字符串与掩码的匹配。比较类似的哈希值(int数字彼此接近),这些将是类似的字符串。

这是一个提示。您可以更容易或更深入,取决于您的要求。

答案 2 :(得分:0)

最后我用perl和regex解决了,我已经定义了我的字符串掩码$ FOO $ BAR $ BAZ,然后我将输入字符串与它们进行了比较

if ($myinputstring =~ $FOO) { 
 statement 
} elseif($myinputstring =~ $BAR) {
 otherstatment
} elseif ($myinputstring =~ $BAZ) {
 someotherstatement
} else {
 print_to_unmatched_log
}

由于

答案 3 :(得分:0)

最后我简化了我的问题,我收回了bash解决方案。 这是一个快速伪,告诉我你在想什么。

pre:
myregex1="^[0-9]{2}/[0-9]{2}/[0-9]{4}[[:space:]][0-9]{2}:[0-9]{2}$"
myregex2="^[[:space:]]\([0-9]{3}\)$"
myregex3="^[[:space:]][0-9]{8}$"
myregex4="^foo[[:space:]]bar$"
myregex5="^[[:space:]]baz\([0-9]{3}\)$"
...
nospace() { printf "$1" | sed -e 's/^[[:space:]]*//'; }



   the code:
    while loop each line of my source text file; do
    buffer="";i=0
    while IFS= read -r -N 1 char; do
    buffer+="$char"; let "i++"
    if [[ $buffer =~ $myregex1 ]]; then printf -v myvar1 "$(nospace "$buffer")"; i=$(( $i - ${#buffer} )); buffer="${buffer::-$i}" 
    elif [[ $buffer =~ $myregex2 ]]; then printf -v myvar2 SAME_STATEMENT_BEFORE
    elif SAME_STATEMENT_BEOFRE_WITH_MYVAR3
    elif ...
    fi
    done <<< "$mylinegotfromtextfile"
    done < $mytextfile

就是这样,你知道更好的解决方案吗?