我在部署我们代码的其中一台测试服务器上有一个 bash 函数,但其中一个命令经常失败,我们找不到原因。我们只是重试,直到它起作用。
如果该命令失败,我想让该函数重试。在函数中,我做了这样的事情:
command_to_run || { echo "failed, retrying"; call_function; }
Run Code Online (Sandbox Code Playgroud)
它像我想要的那样再次调用该函数,但它也允许该函数继续执行。如何在再次调用之前停止当前函数的执行?
我想在文件中的多行中搜索特定字符串并获取找到匹配项的行。
但是,我的问题是,该文件包含一个很长的字符串,而不是单词,我想搜索这个长字符串的子序列。因此,我不能使用 pcregrep 而只能搜索 word1\nword2。因为我实际上想获取找到匹配项的行号,所以我不能只删除所有换行符...
这是我的文件的示例,我只是将匹配的字符串大写,以便您可以找到它:
要搜索的字符串:
gcbcdbfceebcfhfchaaccdgfcegffgedffaeaedcbaedhacebeeebcechbcbfeeccbdhcbfg
Run Code Online (Sandbox Code Playgroud)
要搜索的文件:
abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde
abcdeabcde***GCBCDBFCEEBCFHFCHAACCDGFCEGFFGEDFFAEAEDC
BAEDHACEBEEEBCECHBCBFEECCBDHCBFG***ggfbhbgcedabceedfa
fbaaechaabdbffbebecebaacfcfcdcggfchddcefbcbdegbbba
Run Code Online (Sandbox Code Playgroud)
你们中有人有一个简单的解决方案吗?
如果手头没有工具可以做到这一点,我只会编写一个简短的 python 脚本来做到这一点,但我想任何 bash 工具都会比这更有效......
编辑:
非常感谢您的回答,如果知道换行符的位置,它们工作得很好。
但是,我很抱歉我的问题不准确。我的问题是,我不知道文件中的字符串中是否有换行符,甚至不止一个换行符,而且,我不知道它在哪里。我通过删除无意中插入的换行符来更正我的搜索字符串。
有没有办法允许在字符串的任何位置换行?
我有一台 debian 机器,在那里我很难通过 ssh 登录。通过 ssh 在服务器上执行命令没问题——只是我没有得到提示,但连接再次终止:
> ssh root@192.168.2.109
Linux debian 2.6.32-5-kirkwood #1 Sun May 6 16:57:51 UTC 2012 armv5tel
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Apr 17 21:54:34 2013 from 192.168.2.101
Connection to 192.168.2.109 closed.
Run Code Online (Sandbox Code Playgroud)
正如我所说,运行命令效果很好:
> ssh root@192.168.2.109 cat /etc/bash.bashrc …Run Code Online (Sandbox Code Playgroud) 我是 bash 脚本的新手,我只想做一个简单的小事,但是我在网上阅读的所有内容似乎都不适合我!
所以我在这里有这个脚本:
#!/bin/bash
if [[ $1 = "32"]]
then
mv config.h config64.h
mv config32.h config.h
mv Makefile Makefile64
mv Makefile32 Makefile
echo "READY FOR 32 BITS!"
elif [[ $2 = "64" ]]
then
mv config.h config32.h
mv config64.h config.h
mv Makefile Makefile32
mv Makefile64 Makefile
echo "READY FOR 64 BITS!"
fi
Run Code Online (Sandbox Code Playgroud)
我得到错误:
./switch-bits.sh: line 3: syntax error in conditional expression
./switch-bits.sh: line 4: syntax error near `then'
./switch-bits.sh: line 4: `then'
Run Code Online (Sandbox Code Playgroud)
所以我的手被扔在了这里……怎么了?
我从来没有听说过这可能,所以答案可能不是。但也许有人知道得更好。
我知道你可以使用sftp之间交换文件的主机和遥控器,你既可以:sftp从主机到远程,从远程到主机一旦你已经连接到远程使用SSH。
但是现在我的问题是,一旦您连接到远程机器,SSH是否可以使用已建立的连接传输文件?这太合乎逻辑了,我已经连接上了,身份验证完成了,为什么不只使用lls, put. 或者使用一些可以绕过远程 bash 输入行并在主机之间执行某些操作的键组合。
我想要一种访问文件的快捷方式,我通常在 bash 中使用它。例如,查看日志。现在我使用:
less /var/log/user/server.log
less /var/log/user/server2.log
Run Code Online (Sandbox Code Playgroud)
我想要捷径,做
less server.log
less server2.log
Run Code Online (Sandbox Code Playgroud)
我在 .bash_profile 中尝试了这个变体,但在某处有一个错误:
less() { if [[ $@ == "server.log" ]]; then command less /var/log/user/server.log; else command less "$@"; fi; }
Run Code Online (Sandbox Code Playgroud) 我有一个s3cmd ls --list-md5命令的输出。
2013-05-22 12:20 1965154 41eae9b40d23de2f02bf07635870f6d0 s3://company-backup/company/amazon/ip-11-11-111-11/backup_server245/app.20121117040001.gz
2013-05-22 12:20 11456836 541b1bf78682f48867cc99dbb53c4c3a s3://company-backup/company/amazon/ip-11-11-111-11/backup_server245/app.20121118040001.gz
..
Run Code Online (Sandbox Code Playgroud)
我正在尝试验证md5sum来自存储桶中的对象是否与md5sum本地机器中的对象匹配。因此,我需要将hash结果作为fourth列,将文件名作为fifth列。
像那样:
41eae9b40d23de2f02bf07635870f6d0 s3://company-backup/company/amazon/ip-11-11-111-11/backup_server245/app.20121117040001.gz
Run Code Online (Sandbox Code Playgroud)
但我只需要文件名,因此我使用basename命令(我只是不知道如何在这里使用它,但我会弄清楚),最后看起来像这样:
s3=`s3cmd ls --list-md5 s3://company-backup/company/amazon/ip-11-11-111-11/backup_server245/`;
echo "$s3";
echo "$s3" | tr -s ' ' | cut -d ' ' -f 4;
echo "$s3" | tr -s ' ' | cut -d ' ' -f 5;
Run Code Online (Sandbox Code Playgroud)
现在我需要将结果存储echo's在相同的变量中,如下所示:
41eae9b40d23de2f02bf07635870f6d0 app.20121117040001.gz
Run Code Online (Sandbox Code Playgroud)
所以我可以将结果s3cmd ls --list-md5sum与我md5sum *.gz在本地运行的结果进行比较。 …
我正面临 Ubuntu 的问题。ll如果我从 SSH 登录到我的系统,那么Bash 别名就不起作用。bash在 shell 中作为命令写入后它工作正常。
它曾经工作过。可能是什么问题呢?
echo $SHELL
/bin/bash
Run Code Online (Sandbox Code Playgroud) 为什么不起作用echo * | rm -f?根据我的理解,echo *应该列出目录中的所有文件,管道应该将此列表作为参数发送给rm -f命令,该命令应该删除文件。我错过了什么?
我在 .txt 上运行 bash 命令“less”。打印出文件中的行后,将打印文件名和“(END)”。但是我没有再次收到命令提示符。
除了关闭终端窗口并打开一个新窗口之外,我不知道如何进行。
那么,我如何通过这个“(END)”来获得提示?