提问人:Max 提问时间:2/9/2023 最后编辑:Max 更新时间:3/13/2023 访问量:114
将复杂字符串传递给变量或将变量传递到 EOF 中
Pass complicated string to a variable OR pass variables into EOF
问:
根据要求更新
这里将使用一些基本的日期变量。
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.txt
MyVariable
file.txt
User1
User2
User3
现在我创建一个 while 循环来从文件中读取并添加到$line
MyVariable
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 循环的末尾和之前使用,它将被编码并在远程服务器上使用,如下所示......MyVariable
EOF
done < 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}'
希望这能更清楚一点,请告诉我。
谢谢
答:
0赞
Max
2/13/2023
#1
看起来用于 LINE 的文件有问题(以前从未见过)
重新创建文件后,能够通过使用example1
更新文件未损坏,与wmat不同。
我确实使用命令来格式化它,一切都有效......dos2unix
评论
'awk ..${varName}....'
"awk '{....\"$month$day 23:30:00\"...}'"
<<EOS
while
set -x
set +x
$line
printf 'MyVariable=%s\n' "$MyVariable"
$line
I am trying to assign a string with special characters to a variable