我正在尝试通过创建一个简单的bash for循环来更改所有子目录的权限:
for dir in `find . -type d`; do chmod 755 "$dir"; done
Run Code Online (Sandbox Code Playgroud)
但是,它抱怨不存在的目录.通过简单地从循环中打印目录名称(替换chmod 755 "$dir"为echo "$dir"),我发现当目录名称中有空格时会出现问题.会发生什么是for循环分割find每个换行符和空格的结果.
我想以某种方式使它仅根据换行符分割结果并忽略空格.双引号应确保字符串chmod作为一个参数.如何更改拆分?
我有两个N列数的文件
文件1:
A 1 2 3 ....... Na1
B 2 3 4 ....... Nb1
Run Code Online (Sandbox Code Playgroud)
文件2:
A 2 2 4 ....... Na2
B 1 3 4 ....... Nb2
Run Code Online (Sandbox Code Playgroud)
我想要一个输出,其中File1的第一列值将从File2的第一列中减去,这样直到N列,如下所示:
A -1 0 -1 ........ (Na1-Na2)
B 1 0 0 ........ (Nb1-Nb2)
Run Code Online (Sandbox Code Playgroud)
如何做到这一点是在Linux环境下的AWK或Perl脚本?
所以我最近了解到kill不是同步命令,所以我在bash中使用while循环,这很棒:
while kill PID_OF_THE_PROCESS 2>/dev/null; do sleep 1; done
Run Code Online (Sandbox Code Playgroud)
但是,有些情况(非常罕见,但它们仍然会发生),其中进程被卡住,并且它不会对kill信号起作用.在这些情况下,杀死应用程序的唯一方法是使用" kill -9 ".
所以我想知道,如果循环已达到第10次迭代,如何在bash中修改上面的while循环以使用-9参数?
我有一个脚本,必须在多个主机上的每个主机上执行“ sudo”操作。我试图使工作正常,所以我只需要输入一次,就遇到了一些问题。
首先,建议使用几个示例:
/usr/bin/expect <<EOD
spawn ssh -t $host /usr/bin/sudo -v
expect "Password:"
send "$SUDOPASS\n"
EOD
Run Code Online (Sandbox Code Playgroud)
但是,一旦我输入第二个“ <”,所有的引用就搞砸了,我的脚本将以意外的文件结尾终止。这真的很奇怪,因为我对cat使用了相同的机制,以用其他脚本写出文件。
其他示例表明:
/usr/bin/expect -c "
spawn ssh -t $host /usr/bin/sudo -v
expect "Password:"
send "$SUDOPASS\n"
"
Run Code Online (Sandbox Code Playgroud)
以这种方式进行操作(并在期望值上加上-d),我得到的错误是:没有tty并重复输入密码,并在密码末尾附加了“ n”,因此它没有发送换行符(我已经尝试过'\ r”),但似乎转义了“ n”
由于我发现的大多数示例都来自Linux,因此我希望(哈,哈,双关语不是故意的!)他们使用的是GNU期望,而我使用的是BSD期望。我正在阅读手册页,但是“ spawn”一词出现了很多次,可能需要一段时间才能偶然发现正确的实例。
这似乎是最接近工作的结果:
flamingo:~ jnojr$ Scripts/getinfo_expect.sh
Assuming you have one 'sudo' password for all of your hosts, enter it now:
expect version 5.45
spawn /usr/bin/ssh -t macbook /usr/bin/sudo -v
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized …Run Code Online (Sandbox Code Playgroud) 在我的shell脚本中,我有以下代码
echo * | tr ' ' '\n'
Run Code Online (Sandbox Code Playgroud)
在这里,我注意到虽然我使用*,但是它正在跳过隐藏文件(.*)之后我尝试了一个明显的改变
echo .* | tr ' ' '\n'
Run Code Online (Sandbox Code Playgroud)
这解决了我的隐藏文件问题.但我对这种奇怪的行为感到好奇*
因为.*是*
的理想输出的子集
echo* - >所有文件包括隐藏文件
echo.* - >所有隐藏文件
echo [^.]* - >所有非隐藏文件(当前为echo*)
因此echo*表现得像echo [^.]*
如何使用echo获取包括隐藏文件在内的整个文件列表.类似的是ls和dir的输出,尽管ls -a给出了理想的输出
我有一个问题,我无法在stackoverflow或网络上的任何地方找到帮助.
我有一个程序(芹菜分布式任务队列),我有多个实例(工人),每个实例都有一个日志文件(celery_worker1.log,celery_worker2.log).
重要的错误存储在数据库中,但我喜欢在运行新操作时不时地拖尾这些日志以确保一切正常(loglevel更低).
我的问题:这些日志占用了大量磁盘空间.我想做什么:能够只在我需要时"观察"日志(tail -f),而不需要占用大量空间.
我的想法到现在为止:
有没有办法有一个非阻塞的命名管道,它会在尾部时抛出stdout,并在没有时抛出/ dev/null?
或者这种管道有技术难题吗?如果有,他们是什么?
谢谢您的回答!
这是我在以下 bash脚本中使用的代码片段:
for user_input in `awk '{print}' testfile_$$.txt`
do
ipaddress=`echo $user_input | cut -d';' -f 1`
command="${config_mode}`echo $user_input | cut -d';' -f 2-`"
ping -w 1 $ipaddress 1> /dev/null 2> $ERR_LOG_FILE 1> $LOG_FILE
if [ $? -eq 0 ];then
ssh "$USERNAME@$ipaddress" "$command"
>> $LOG_FILE
fi
done
Run Code Online (Sandbox Code Playgroud)
我如何使用expect在此脚本中自动执行ssh登录.
我很期待并开始测试它(它失败了):
#!/usr/bin/bash
set force_conservative 0 ;# set to 1 to force conservative mode even if
;# script wasn't run conservatively originally
if {$force_conservative} {
set send_slow {1 .1}
proc send {ignore arg} …Run Code Online (Sandbox Code Playgroud) 我正在研究Ubuntu,我想创建一个执行以下操作的bash文件:
在核心上启动一个程序(prog0)1.
等待3秒钟.
然后记录prog0的CPU和内存使用情况信息(我在核心0上使用两个pidstat实例来记录该信息).
然后在核心0上启动另一个程序(prog1).
当prog1完成时(我认为prog1自动退出),我想退出所有前一个进程(prog0和两个pidstat).
taskset -c 1 prog0 -option0 &
sleep 3
taskset -c 0 pidstat 1 -C prog0 -u > log2 &
taskset -c 0 pidstat 1 -C prog0 -r > log3 &
taskset -c 0 prog1 -option1 > log1
Run Code Online (Sandbox Code Playgroud)
我不知道如何退出或杀死prog1完成后启动的所有进程.
阿罗哈,我一直试图弄清楚如何在两个占位符之间替换/插入文本字符串.
#start
REPLACE ANYTHING IN HERE
#end
Run Code Online (Sandbox Code Playgroud)
最初我试图通过sed用BASH做这个,但是当我试图将一个变量传递给sed时遇到了障碍.
sed -n -i '/#start/{p;:a;N;/#end/!ba;s/.*\n/hello\n/};p' file.txt
Run Code Online (Sandbox Code Playgroud)
返回
#start
hello
#end
Run Code Online (Sandbox Code Playgroud)
但是当我尝试时却没有快乐
sed -n -i '/#start/{p;:a;N;/#end/!ba;s/.*\n/$replace_var\n/};p' file.txt
Run Code Online (Sandbox Code Playgroud)
要么
sed -n -i "/#start/{p;:a;N;/#end/!ba;s/.*\n/$replace_var\n/};p" file.txt
Run Code Online (Sandbox Code Playgroud)
我已经在这里工作了几个小时,并且已经四处寻找但没有找到解决方案.我要尝试使用python或其他语言,或者使用awk.我在这个领域有点新意,所以任何有用的信息都会受到赞赏.
提前致谢
这就是我最终的目标.这是一个与cron一起使用最新发布的ssh阻止列表更新我的/var/etc/hosts.deny文件的脚本.
import re
import urllib2
hosts_deny = open('/etc/hosts.deny','r+')
hosts_deny_text = hosts_deny.read()
blockedHosts = urllib2.urlopen('http://www.openbl.org/lists/hosts.deny').read()
place = re.compile('(?<=#start)(\r?\n)'
'(.*?)'
'(?=\r?\n#end)',re.DOTALL)#DOTALL enables '.' to also include
#a new line
hosts_deny_text = re.sub(place, '\n'+ blockedHosts, hosts_deny_text)
hosts_deny.seek(0)
hosts_deny.write(hosts_deny_text)
hosts_deny.close()
Run Code Online (Sandbox Code Playgroud) 我知道egrep有一个非常有用的方法,通过使用以下两个表达式:
egrep "pattern1.*pattern2"|egrep "pattern2.*pattern1" filename.txt|wc -l
Run Code Online (Sandbox Code Playgroud)
但是,在搜索三个表达式时,有一种简单的方法可以使用egrep的AND运算符,因为随着添加额外表达式,排列会呈指数增长.
我知道另一种方式,sort|uniq -d 但我正在寻找一个更简单的解决方案.
编辑:
我目前的搜索方式将产生五个总结果:
#!/bin/bash
pid=$$
grep -i "angio" rtrans.txt|sort|uniq|egrep -o "^[0-9]+ [0-9]+ " > /tmp/$pid.1.tmp
grep -i "cardio" rtrans.txt|sort|uniq|egrep -o "^[0-9]+ [0-9]+ " > /tmp/$pid.2.tmp
grep -i "pulmonary" rtrans.txt|sort|uniq|egrep -o "^[0-9]+ [0-9]+ " > /tmp/$pid.3.tmp
cat /tmp/$pid.1.tmp /tmp/$pid.2.tmp|sort|uniq -d > /tmp/$pid.4.tmp
cat /tmp/$pid.4.tmp /tmp/$pid.3.tmp|sort|uniq -d > /tmp/$pid.5.tmp
egrep -o "^[0-9]+ [0-9]+ " /tmp/$pid.5.tmp|getDoc.mps > /tmp/$pid.6.tmp
head -10 /tmp/$pid.6.tmp
mumps@debianMumpsISR:~/Medline2012$ AngioAndCardioAndPulmonary.script
1514 Structural composition of central pulmonary arteries. Growth potential after …Run Code Online (Sandbox Code Playgroud)