标签: bash

当目录名称中包含空格时使用查找结果

我正在尝试通过创建一个简单的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作为一个参数.如何更改拆分?

bash shell

5
推荐指数
1
解决办法
1751
查看次数

使用AWK从两个文件中构造n个列

我有两个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脚本?

linux bash perl awk gawk

5
推荐指数
1
解决办法
1116
查看次数

bash:在while循环中反击(kill和kill -9)

所以我最近了解到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参数?

bash scripting kill while-loop kill-process

5
推荐指数
1
解决办法
5595
查看次数

OSX bash和期望

我有一个脚本,必须在多个主机上的每个主机上执行“ 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)

bash

5
推荐指数
1
解决办法
9371
查看次数

shell脚本中wildcharacter*的奇怪行为

在我的shell脚本中,我有以下代码

echo * | tr ' ' '\n'
Run Code Online (Sandbox Code Playgroud)

在这里,我注意到虽然我使用*,但是它正在跳过隐藏文件(.*)之后我尝试了一个明显的改变

echo .* | tr ' ' '\n'
Run Code Online (Sandbox Code Playgroud)

这解决了我的隐藏文件问题.但我对这种奇怪的行为感到好奇*

因为.*是*
的理想输出的子集

  1. echo* - >所有文件包括隐藏文件

  2. echo.* - >所有隐藏文件

  3. echo [^.]* - >所有非隐藏文件(当前为echo*)

因此echo*表现得像echo [^.]*

如何使用echo获取包括隐藏文件在内的整个文件列表.类似的是ls和dir的输出,尽管ls -a给出了理想的输出

bash shell zsh wildcard echo

5
推荐指数
2
解决办法
138
查看次数

记录到非阻塞命名管道?

我有一个问题,我无法在stackoverflow或网络上的任何地方找到帮助.

我有一个程序(芹菜分布式任务队列),我有多个实例(工人),每个实例都有一个日志文件(celery_worker1.log,celery_worker2.log).

重要的错误存储在数据库中,但我喜欢在运行新操作时不时地拖尾这些日志以确保一切正常(loglevel更低).

我的问题:这些日志占用了大量磁盘空间.我想做什么:能够只在我需要时"观察"日志(tail -f),而不需要占用大量空间.

我的想法到现在为止:

  • 输出日志到stdout,而不是文件:这里不可能,因为我有很多工人输出到不同的文件,但我想一次拖尾它们(tail -f celery_worker*.log)
  • 使用logrotate:对我来说这是一个"OK"的解决方案.我不希望这是一个日常任务,但宁愿不为此花一分钟crontab,而且更多,服务器不是我的,所以这意味着在admin-sys方面的一些工作
  • 使用命名管道:它一见钟情,但我不知道命名管道(linux FIFO)阻塞.因此,当我不同时尾随-f所有管道,或者当我刚退出尾部时,记录器的写入操作被阻止.

有没有办法有一个非阻塞的命名管道,它会在尾部时抛出stdout,并在没有时抛出/ dev/null?

或者这种管道有技术难题吗?如果有,他们是什么?

谢谢您的回答!

linux bash logging pipe fifo

5
推荐指数
1
解决办法
2068
查看次数

如何在bash脚本中使用expect

这是我在以下 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)

bash expect

5
推荐指数
1
解决办法
3万
查看次数

Bash linux:并行启动多个程序,并在完成后停止所有程序

我正在研究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完成后启动的所有进程.

linux bash

5
推荐指数
1
解决办法
2817
查看次数

使用变量的内容查找并替换两个占位符之间的所有内容

阿罗哈,我一直试图弄清楚如何在两个占位符之间替换/插入文本字符串.

#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)

python regex linux bash sed

5
推荐指数
1
解决办法
1548
查看次数

egrep AND运算符

我知道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)

bash grep

5
推荐指数
1
解决办法
2万
查看次数

标签 统计

bash ×10

linux ×4

shell ×2

awk ×1

echo ×1

expect ×1

fifo ×1

gawk ×1

grep ×1

kill ×1

kill-process ×1

logging ×1

perl ×1

pipe ×1

python ×1

regex ×1

scripting ×1

sed ×1

while-loop ×1

wildcard ×1

zsh ×1