使用 for 循环切换大小写以匹配字符串

使用 for 循环切换大小写以匹配字符串

我正在尝试以下事情但无法成功

我有包含以下内容的文件

events_0-new
events_1-new
events_2-new
events_3-new
events_4-new
events_5-new
events_6-new
system-events_0-new
system-events_1-new
system-events_2-new
system-events_3-new
system-events_4-new
system-events_5-new
system-events_6-new
ylog_0-new
ylog_1-new

我有下面的脚本

for i in `cat new.txt`
do
   case $i in
     system-events_*)
       for file in `cat new.txt | grep system-events_*`
        do
                echo "$file"  >> polo.txt
        done
        ;;
     events_*)
               for file in `cat new.txt | grep events_*`
            do
                    echo "$file" >> polo.txt
        done
        ;;
     ylog_*)
       for file in `cat new.txt | grep ylog_*`
            do
                    echo "$file"  >> polo.txt
        done
        ;;
    esac
done

但它多次打印值,因为我在这里使用了 case

电流输出

events_0-new
events_1-new
events_2-new
events_3-new
events_4-new
events_5-new
events_6-new
events_0-new
events_1-new
events_2-new
events_3-new
events_4-new
events_5-new
events_6-new
system-events_0-new
system-events_1-new
system-events_2-new
system-events_3-new
system-events_4-new
system-events_5-new
system-events_6-new
system-events_0-new
system-events_1-new
system-events_2-new
system-events_3-new
system-events_4-new
system-events_5-new
system-events_6-new
ylog_0-new
ylog_1-new
ylog_0-new
ylog_1-new

所需的输出应该是,如果 case 与 events_* 匹配,则它应该只打印一次所有事件输出,它不应该为 events_0-new 运行相同的 case,然后为 events_1-new 运行相同的 case,对于 events_2-new 依此类推,直到最后。

这就是我想要的,如果大小写与 events_* 匹配,那么它应该像下面一样打印而不是七次 events_0-new events_1-new events_2-new events_3-new events_4-new events_5-new events_6-new

实际上我想在curl命令中使用它们作为环境变量来插入仅属于该字符串的数据

例子:

curl -X PUT 'http://localhost:9200/$file' -H 'Content-Type: application/json' -d events.json
curl -X PUT 'http://localhost:9200/$file' -H 'Content-Type: application/json' -d ylog.json
curl -X PUT 'http://localhost:9200/$file' -H 'Content-Type: application/json' -d system-events.json

这里 $file 应该从 new.txt 中作为 events_0 ...events_6 获取,对于其他字符串也是如此。

可能是我缺少完成此操作的地方,或者不知道执行此操作的最简单方法。

有人可以帮助我如何在大小写匹配的情况下只能打印一次吗?它应该作为一个大小写运行一次,而不应该对具有相同大小写的其他字符串重复这些。

请指导。

问候, 萨姆

答案1

看起来您只想获取_读取的字符串中第一个之前的部分new.txt,并在调用中使用它curl

#!/bin/bash

headers=( -H 'Content-Type: application/json' )
baseurl='http://localhost:9200'

while IFS= read -r entry; do
    data=${entry%%_*}.json  # strip off all at first "_" and add ".json"

    curl -X PUT "${headers[@]}" -d "$data" "$baseurl/$entry"
done <new.txt

如果您需要在处理文件之前过滤掉文件中的三种特定类型的行:

#!/bin/bash

headers=( -H 'Content-Type: application/json' )
baseurl='http://localhost:9200'

grep -e '^events__' -e '^system-events_' -e '^ylog_' new.txt |
while IFS= read -r entry; do
    data=${entry%%_*}.json  # strip off all at first "_" and add ".json"

    curl -X PUT "${headers[@]}" -d "$data" "$baseurl/$entry"
done

相关内容