将复杂字符串传递给变量或将变量传递到 EOF 中

Pass complicated string to a variable OR pass variables into EOF

提问人:Max 提问时间:2/9/2023 最后编辑:Max 更新时间:3/13/2023 访问量:114

问:

根据要求更新

这里将使用一些基本的日期变量。

month=$(date +%b)
day=$(date -d "today" '+%d')

现在。。。

我有一个字符串,我需要分配给一个变量,它有很多特殊字符以及像$month $day

awk  '\$0 >= "$month$day 00:00:00" && \$0 <= "$month$day 23:30:00" && !/something/ && /something2/ && !/something3/ && !/something4/' /var/log/messages | awk -F "NameOfSoemthing " '{print \$2}'

将其分配给变量的唯一方法是使用 EOF,这样......

read -r MyVariable << EOF
awk  '\$0 >= "$month$day 00:00:00" && \$0 <= "$month$day 23:30:00" && $line && !/something/ && /something2/ && !/something3/ && !/something4/' /var/log/messages | awk -F "NameOfSoemthing " '{print \$2}'
EOF

输出符合预期

echo $MyVariable

awk '$0 >= "Feb10 00:00:00" && $0 <= "Feb10 23:30:00" && && !/something/ && /something2/ && !/something3/ && !/something4/' /var/log/messages | awk -F "NameOfSoemthing " '{print $2}'

一切都很完美。

但是现在我有一个文件,每次运行脚本时都会更新该文件,该文件包含将在 . 示例...file.txtMyVariablefile.txt

User1
User2
User3

现在我创建一个 while 循环来从文件中读取并添加到$lineMyVariable

example1

while read line; do
read -r MyVariable << EOF
awk  '$line && \$0 >= "$month$day 00:00:00" && \$0 <= "$month$day 23:30:00" && !/something/ && /something2/ && !/something3/ && !/something4/' /var/log/messages | awk -F "NameOfSoemthing " '{print \$2}'
EOF
done < file.txt

对于整个图片将在 while 循环的末尾和之前使用,它将被编码并在远程服务器上使用,如下所示......MyVariableEOFdone < file.txt

echo -n "$MyVariable" > ToBeEncoded.txt
EncodedCommand=$(base64 -w0 /home/max/ToBeEncoded.txt)
sshpass -p MyPass ssh -n -o StrictHostKeyChecking=no -tt [email protected] "echo "$EncodedCommand" | base64 -d | sudo bash" 

所以 while 循环的输出如下所示。.

echo $MyVariable

 && $0 >= "Feb10 00:00:00" && $0 <= "Feb10 23:30:00" && !/something/ && /something2/ && !/something3/ && !/something4/' /var/log/messages | awk -F "NameOfSoemthing " '{print $2}'

但是我注意到的,这取决于你把 例如,如果我像这样放在日期和时间之后......$line$line

example2

while read line; do
    read -r MyVariable << EOF
    awk  '\$0 >= "$month$day 00:00:00" && \$0 <= "$month$day 23:30:00" && $line && !/something/ && /something2/ && !/something3/ && !/something4/' /var/log/messages | awk -F "NameOfSoemthing " '{print \$2}'
    EOF
done < UserUsed.txt

我得到的输出,看起来像这样......

&& !/something/ && /something2/ && !/something3/ && !/something4/' /var/log/messages | awk -F "NameOfSoemthing " '{print $2}'

所以基本上缺少整个部分。

我想要的输出,看起来像这样

awk 'User1 && $0 >= "Feb10 00:00:00" && $0 <= "Feb10 23:30:00" && !/something/ && /something2/ && !/something3/ && !/something4/' /var/log/messages | awk -F "NameOfSoemthing " '{print $2}'

或者像这样,如果 放在日期和时间之后,就像在第二个例子中一样$line

awk '$0 >= "Feb10 00:00:00" && $0 <= "Feb10 23:30:00" && User1 && !/something/ && /something2/ && !/something3/ && !/something4/' /var/log/messages | awk -F "NameOfSoemthing " '{print $2}'

希望这能更清楚一点,请告诉我。

谢谢

bash 变量 awk while-loop eof

评论

2赞 shellter 2/9/2023
使用 ,varName 将没有值。您需要使用 dbl-quotes,然后在 awk 脚本中转义您需要的任何 dbl-quotes,即 .另外,您还有需要考虑的东西。计划花一些时间对此进行调试,以使其正确。将循环包装起来并(关闭)可能有助于您了解它是如何工作的。祝你好运。'awk ..${varName}....'"awk '{....\"$month$day 23:30:00\"...}'"<<EOSwhileset -xset +x
0赞 konsolebox 2/9/2023
我没有看到你使用的部分.$line
2赞 konsolebox 2/9/2023
@Max 你真的需要提供更详尽的细节,而不是让我们想象你可能在做什么。我没有从你说的话中得到任何有用的东西。你问如何做 X,但你想做 Y.试着给一些假代码。我们不喜欢在每次澄清后猜测和反复修改建议。
1赞 pjh 2/9/2023
我在循环体的末尾添加并运行它。它打印了我所期望的:文件的每一行都具有相同的基本字符串,并替换为文件中的连续行。确切地说,你想要什么,它与你得到的有何不同?具体的例子(我想要字符串......但我得到了字符串......真的会有所帮助。printf 'MyVariable=%s\n' "$MyVariable"$line
1赞 Ed Morton 2/9/2023
你说,但我在你的问题中看不出那根绳子是什么。是此处文档中的awk命令,还是该awk命令的输出(未显示)或其他内容?请编辑您的问题,以显示您要存储在变量中的字符串的示例以及您要对它执行的操作(即提供示例输入和预期输出)。I am trying to assign a string with special characters to a variable

答:

0赞 Max 2/13/2023 #1

看起来用于 LINE 的文件有问题(以前从未见过) 重新创建文件后,能够通过使用example1

更新文件未损坏,与wmat不同。 我确实使用命令来格式化它,一切都有效......dos2unix