注意:这个问题是这个问答的补充:如何在给定范围内“grep”行长度*不*?
我只需要从长度范围为最小或等于 3 个字符但不长于或等于 10 的文本文件(一个单词列表,用换行符分隔)中获取行。
例子:
输入:
egyezményét
megkíván
ki
alma
kevesen
meghatározó
Run Code Online (Sandbox Code Playgroud)
输出:
megkíván
alma
kevesen
Run Code Online (Sandbox Code Playgroud)
问题:我怎样才能做到这一点bash?
有什么方法可以检查给定用户的 ulimit 使用情况吗?我知道您可以在启动时更改单个进程的 ulimit,或者在运行时更改单个 shell,但我希望能够“监控”用户接近其限制的程度。我计划编写一个bash脚本,将当前的使用百分比报告给 statsd。具体来说,我想跟踪:
ulimit -n )ulimit -u )ulimit -i )我想要的是使用百分比(0-100)。
有很多方法可以显示使用 手动安装的软件包apt,例如:
apt-mark showmanual
Run Code Online (Sandbox Code Playgroud)
但有时输出太多了。例如,如果用户手动安装包foo:
apt-get install foo
Run Code Online (Sandbox Code Playgroud)
...并foo依赖于barand baz,然后apt-mark showmanual会输出:
bar
baz
foo
Run Code Online (Sandbox Code Playgroud)
我们如何仅列出顶级手动安装的软件包(即 foo)而没有它们的依赖项(即not baz,nor bar)?
以下代码似乎有效,但GNU parallel调用apt-rdepends几百次太慢了,(4 核 CPU 需要三个小时):
apt-mark showmanual |
tee /tmp/foo |
parallel "apt-rdepends -f Depends,PreDepends,Suggests,Recommends {} |
tail +2" 2> /dev/null |
tr -s ' ' '\n' |
grep -v '[():]' |
sort -Vu |
grep -wv -f - /tmp/foo
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 shell 脚本将两个浮点数相加。我试过这个:
#!/bin/bash
if [ $# != 2 ]; then
echo "2 arguments are required "
exit
else
x=$1
y=$2
sum = $x + $y
echo ` sum = $sum | bc `
fi
Run Code Online (Sandbox Code Playgroud)
当我向命令行提供两个参数时,例如:
bash filename.sh 2.4 5
Run Code Online (Sandbox Code Playgroud)
...它给了我一个错误: [ 2 != 2 ] command not found
我有一台Linux CentOS服务器,使用的 OS+ 包大约5GB。然后,我将97GB 的数据从 Windows 服务器传输到这台 Linux 服务器上的两个文件夹,计算磁盘使用后,我看到两个文件夹的总大小大于磁盘使用大小。
du -sh在每个文件夹上运行,一个使用50GB,另一个使用47GB
但是运行起来df -h,使用的空间是96GB。( 50GB + 47GB + 5GB ) > 96GB
有什么问题吗?这两个文件夹包含大量文件(100 万+)。谢谢。
所以我有一个while循环:
cat live_hosts | while read host; do \
sortstuff.sh -a "$host" > sortedstuff-"$host"; done
Run Code Online (Sandbox Code Playgroud)
但这可能需要很长时间。我将如何在这个 while 循环中使用 GNU Parallel?
我有一个服务器,它通过NFS将一个包含约 700 万个文件(主要是图像)的目录从其本地磁盘导出到网络客户端。
为了 HA,我需要添加第二个,并使其与第一个保持同步,两者之间的增量尽可能小。
研究建议为此使用lsyncd或其他基于inotify的解决方案,但鉴于创建inotify手表的文件数量需要永恒。对于同样的事情rsync的。
其他可能的解决方案似乎是DRDB,或群集文件系统,如头孢或glusterfs,可是我不得不与那些没有经验,不知道哪一个会更合适,并与许多文件以及应对并仍提供不俗的表现。
请注意,活动主要是读取,很少发生写入。
为了比较不同 shell 之间脚本的运行时间,一些 SE 答案建议使用bash的内置 time命令,如下所示:
time bash -c 'foo.sh'
time dash -c 'foo.sh'
Run Code Online (Sandbox Code Playgroud)
...等,用于每个要测试的外壳。此类基准测试无法消除每个 shell 加载和初始化自身所需的时间。例如,假设上述两种命令被存储在一缓慢的设备具有早期软盘的读取速度,(124KB /秒), dash(一〜150K可执行程序)将加载大约7倍的速度比bash(〜1M),所述壳加载时间会扭曲time数字——这些炮弹的预装载时间与测量炮弹加载后foo.sh每个炮弹下方的运行时间无关。
什么是最好的可移植和通用的 util 来运行脚本计时,可以从每个 shell内运行?所以上面的代码看起来像:
bash -c 'general_timer_util foo.sh'
dash -c 'general_timer_util foo.sh'
Run Code Online (Sandbox Code Playgroud)
注意:没有 shell内置 time命令,因为没有一个是可移植的或通用的。
如果 util 还能够对 shell 的内部命令和管道所花费的时间进行基准测试,而无需用户首先将它们包装在脚本中,那就更好了。像这样的人工语法会有所帮助:
general_timer_util "while read x ; do echo x ; done < foo"
Run Code Online (Sandbox Code Playgroud)
一些shell' …
我正在尝试使用以下方法计算文件夹中包含的文件的平均熵:
{ echo '('; find . -type f -exec entropy {} \; | \
grep -Eo '[0-9.]+$' | \
sed -r 's/$/+/g'; echo '0)/';
find . -type f | wc -l; } | \
tr -d '\n' | bc -l
Run Code Online (Sandbox Code Playgroud)
entropy 作为计算文件的香农熵的可执行文件,给出以下形式的输出:
$ entropy foo
foo: 5.13232
Run Code Online (Sandbox Code Playgroud)
上述命令出错:
(standard_in) 1: syntax error
Run Code Online (Sandbox Code Playgroud)
但是,生成的输出似乎没有问题:
$ { echo '('; find . -type f -exec entropy {} \; | \
grep -Eo '[0-9.]+$' | \
sed -r 's/$/+/g'; echo '0)/'; \
find . …Run Code Online (Sandbox Code Playgroud) 我的印象是插入符号意味着“行的开头”,带有扩展的 POSIX 正则表达式。
但是,当我使用它时,grep它的行为出乎意料。
我在Ubuntu 10.04 Lucid Lynx上使用GNU grep 2.5.4。
我回显一行'你好',然后将它传送grep到搜索“零个或多个空白字符后跟字母h ”的a:
echo ' hello' | grep -E '[:space:]*h'
hello
Run Code Online (Sandbox Code Playgroud)
grep 觉得没问题。
如果我添加一个插入符号来表示我只希望模式匹配“零个或多个空白字符,后跟字符串开头的字母h ”:
echo ' hello' | grep -E '^[:space:]*h'
Run Code Online (Sandbox Code Playgroud)
未找到匹配项。我希望字符串匹配,因为它以空格开头,后跟h。
为什么这个插入符号会阻止匹配?
bash ×4
linux ×3
shell-script ×3
grep ×2
shell ×2
apt ×1
bc ×1
benchmark ×1
centos ×1
deb ×1
debian ×1
disk-usage ×1
files ×1
glusterfs ×1
gnu-parallel ×1
nfs ×1
perl ×1
portability ×1
rsync ×1
sed ×1
timestamps ×1
ubuntu ×1
ulimit ×1