Articles of bash

如何将命令的控制台输出redirect到日志文件?

我的操作系统是RHEL5。 我想要将由以下数据库命令生成的控制台输出指向日志/文件。 psql mydb mydbuser -c "VACUUM ANALYZE VERBOSE" 我试过下面的命令,并没有按预期工作。 但它是打印输出到terminal控制台。 psql mydb mydbuser -c "VACUUM ANALYZE VERBOSE" > vacuum.log psql mydb mydbuser -c "VACUUM ANALYZE VERBOSE" | tee vacuum.log 在这种情况下,这个命令产生的输出不是标准的input/输出/错误吗? 注: psql是PostgreSQL的基于terminal的前端。 它使您能够以交互方式键入查询,将其发送到PostgreSQL,并查看查询结果。

非阻塞bashredirect

有谁知道如何redirect程序的输出,从bash脚本运行到命名pipe道在非阻塞模式('O_NONBLOCK'标志设置)?

列出所有空文件夹

我有一堆嵌套的文件夹。 大多数文件夹包含文件 有些包含数十万个文件。 有些是空的。 我想获得所有空文件夹的列表。 但是,当我运行: find -type d -empty 运行需要很长时间,比运行find -type d要花费很多时间。 我怀疑-empty正在检查所有文件,看它们是否为空,然后-type d正在跳过这些文件。 那么在那里: 1)一种优化发现的方法,以便它将a)find所有的文件夹,然后b)列出空的那些? 要么 2)一个不同的命令(或命令),我可以用来得到这个列表?

Bash并行化CPU密集型进程

tee将stdin转发给指定的每个文件,而pee则是相同的,但是对于pipe道。 这些程序将stdin的每一行发送到指定的每个文件/pipe道。 然而,我正在寻找一种方式来“平衡”标准input到不同的pipe道,所以一行发送到第一个pipe道,另一行到第二个,等等。如果收集pipe道标准输出也是很好的也成为一个stream。 这个用例是一个逐行工作的CPU密集型进程的简单并行化。 我在一个14GB的文件上执行sed ,如果我可以使用多个sed进程,它可以运行得更快。 命令是这样的: pv infile | sed 's/something//' > outfile 要并行化,最好的情况是,如果GNU parallel支持这样的function(由–demux-stdin选项组成): pv infile | parallel -u -j4 –demux-stdin "sed 's/something//'" > outfile 然而,没有这样的select, parallel一直使用它的stdin作为它所调用的命令的参数,比如xargs 。 所以我试了一下,但是速度很慢,原因很明显: pv infile | parallel -u -j4 "echo {} | sed 's/something//'" > outfile 我只是想知道是否还有其他方法可以做到这一点(我自己编写的代码很短)。 如果有一个“负载平衡”的tee (我们称之为lee ),我可以这样做: pv infile | lee >(sed 's/something//' >> […]

任何人都知道是否有CTR + w的对应项,删除光标后面的直接词

我的意思是,当光标位于文字的左侧时,我想删除文字右侧的文字。 CTR + K删除右侧的所有内容,我只想要删除一个单词。

为什么运行这个脚本花费的时间在用户和系统之间差别很大,我怎样才能纠正这个差异呢?

我的应用程序位于负载均衡器的后面,每隔一段时间我都希望对每台计算机进行状态检查,以了解每台计算机上返回index.html文档所需的时间。 该脚本如下所示: for host in 192.168.0.7 192.168.0.8 192.168.0.9; do result=$( ( time wget -q –header="Host: domain.tomonitor.com" http://$host/ ) 2>&1 | grep real | awk '{print $2}' ) date=$(date) echo "$date, $host, $result" done 由于应用程序认为它在domain.tomonitor.com ,所以我在wget请求头中手动设置了它。 它为grep “真实”的时间, awk独自的时间,倾倒到一个$ resultvariables。 从经验上讲,它似乎作为一个基本的手动检查工作相当不错 – 我的各种服务器的响应时间通常需要2-3秒,除非有一些不平衡的连接正在进行。 我直接从我的Mac OS X笔记本电脑对我们的专用networking运行它。 有一天,我想知道是否可以使用cronlogging结果。 我惊讶地发现它有亚秒级的反应,例如0.003秒。 尝试使用名为Geektool的OS X桌面组件将脚本结果安装到我的桌面,并看到类似的亚秒级报告。 我怀疑差异是由于一些用户错误 – 为什么我运行的time wget命令的一些原因将无法正常工作。 任何人都可以告诉我为什么运行这个脚本所花费的时间与用户(我手动运行)和系统(cronjob或geektool)之间的差异如此之大,以及我如何纠正这种差异?

焦油不保留所有者/权限

我有一个tar档案文件系统备份,创build: cd / && tar -cpz -f mybackup.tgz usr/local 做一个 tar tvzf mybackup.tgz 收益率: -rw-rw-r– otto/otto 450 2010-04-15 22:08 usr/local/alpha-4.5/pkg/conf/PLATFORM/sparc drwxr-xr-x otto/otto 0 2009-04-01 08:08 usr/local/alpha-4.5/pkg/ui/ drwxr-xr-x otto/otto 0 2009-04-01 08:08 usr/local/alpha-4.5/pkg/ui/src/ drwxr-xr-x otto/otto 0 2009-04-01 08:08 usr/local/alpha-4.5/pkg/ui/src/thyc/ -rw-r–r– otto/otto 2416 2001-01-13 16:01 usr/local/alpha-4.5/pkg/ui/src/thyc/vid45 -rw-r–r– otto/otto 569 2001-01-13 16:01 usr/local/alpha-4.5/pkg/ui/src/thyc/vid46 不过,像这样解压: tar xvpz -f mybackup.tgz […]

如何在启动shell时运行“source”?

为了使用rvm( https://rvm.beginrescueend.com/ ),我需要运行 source ~/.bash_profile 每当我启动一个新的shell。 当我启动计算机时,如何自动执行此操作,而不必每次都键入? 这是我的.bash_profile: [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a fu nction* [[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function

Kickstart%发布问题

我正在configurationkickstartconfiguration文件,我想创build一些脚本文件。 我正在这样做: cat <<EOF >>/scripts/myfile.pl #!/usr/bin/perl … my $int; `useradd me`; … EOF 在PXE启动和安装过程之后,当我检查文件时,所有以“$”开头的行,以及从反引用开始的行都消失了。 反斜杠backquotes似乎已经工作,但不是$。 有没有办法做到这一点?

从输出中删除2行,grep匹配正则expression式加上下一个1

我有一个来自postgresql的日志文件,它具有格式的日志条目; LOG: execute <unnamed>: /match this here/ DETAIL: parameters: /also want to filter this line/ 我认为这可能是可能的 grep -v –after-context=1 'match this here' /my/log/file.log 但它不起作用。 有一些sed / awk / grep的魔术,还是我必须做一些Perl?