小编agc*_*agc的帖子

如何“grep”给定范围内的行长?

注意:这个问题是这个问答的补充:如何在给定范围内“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

grep bash sed perl

41
推荐指数
3
解决办法
7万
查看次数

如何检查ulimit使用情况

有什么方法可以检查给定用户的 ulimit 使用情况吗?我知道您可以在启动时更改单个进程的 ulimit,或者在运行时更改单个 shell,但我希望能够“监控”用户接近其限制的程度。我计划编写一个bash脚本,将当前的使用百分比报告给 statsd。具体来说,我想跟踪:

  1. 打开文件(ulimit -n )
  2. 最大用户进程数(ulimit -u )
  3. 未决信号(ulimit -i )

我想要的是使用百分比(0-100)。

linux bash ulimit

41
推荐指数
3
解决办法
9万
查看次数

列出没有依赖项的顶级手动安装的包

有很多方法可以显示使用 手动安装的软件包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)

ubuntu debian apt deb

16
推荐指数
1
解决办法
7085
查看次数

使用 shell 脚本将两个浮点数相加

我正在尝试使用 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

bash shell-script

15
推荐指数
3
解决办法
4万
查看次数

为什么 df 和 du 报告的磁盘使用情况存在差异?

我有一台Linux CentOS服务器,使用的 OS+ 包大约5GB。然后,我将97GB 的数据从 Windows 服务器传输到这台 Linux 服务器上的两个文件夹,计算磁盘使用后,我看到两个文件夹的总大小大于磁盘使用大小。

du -sh在每个文件夹上运行,一个使用50GB,另一个使用47GB

但是运行起来df -h,使用的空间是96GB。( 50GB + 47GB + 5GB ) > 96GB

有什么问题吗?这两个文件夹包含大量文件(100 万+)。谢谢。

linux centos disk-usage

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

我将如何在这个 while 循环中使用 GNU Parallel?

所以我有一个while循环:

cat live_hosts | while read host; do \
    sortstuff.sh -a "$host" > sortedstuff-"$host"; done
Run Code Online (Sandbox Code Playgroud)

但这可能需要很长时间。我将如何在这个 while 循环中使用 GNU Parallel?

shell-script files gnu-parallel

12
推荐指数
1
解决办法
6101
查看次数

在两台 Linux 服务器之间同步数百万个文件

我有一个服务器,它通过NFS将一个包含约 700 万个文件(主要是图像)的目录从其本地磁盘导出到网络客户端。

为了 HA,我需要添加第二个,并使其与第一个保持同步,两者之间的增量尽可能小。

研究建议为此使用lsyncd或其他基于inotify的解决方案,但鉴于创建inotify手表的文件数量需要永恒。对于同样的事情rsync的

其他可能的解决方案似乎是DRDB,或群集文件系统,如头孢glusterfs,可是我不得不与那些没有经验,不知道哪一个会更合适,并与许多文件以及应对并仍提供不俗的表现。

请注意,活动主要是读取,很少发生写入。

linux nfs rsync synchronization glusterfs

10
推荐指数
1
解决办法
2231
查看次数

通用非 bash `time` 基准测试替代方案?

为了比较不同 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' …

shell shell-script timestamps benchmark portability

10
推荐指数
5
解决办法
8230
查看次数

无法使用 bc 对从 stdin 收到的数字求和

我正在尝试使用以下方法计算文件夹中包含的文件的平均熵:

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

shell bash bc

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

grep caret 似乎没有效果

我的印象是插入符号意味着“行的开头”,带有扩展的 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

为什么这个插入符号会阻止匹配?

grep regular-expression

7
推荐指数
1
解决办法
2565
查看次数