在过去六个月左右的时间里,我在 bash 中组合搜索时遇到了问题。确切的示例与 Python 编程有关,但适用于任何类型的检测/操作。
假设我想要我所在目录中所有 Python 文件的列表。这很简单:
find . -name '*.py'
Run Code Online (Sandbox Code Playgroud)
现在,假设我只对那些包含字符串“psycopg”的 Python 文件感兴趣,例如因为我想从旧的 PostgreSQL 访问库psycopg 转换到psycopg2。还是很简单的:
grep -l psycopg `find . -name '*.py'`
Run Code Online (Sandbox Code Playgroud)
现在,假设我想列出这些文件的完整列表,以检查它们的日期戳以查看我上次接触它们的时间。我也希望在 gedit 中打开它们,但让我们坚持以下列表:
ls -l `!!`
Run Code Online (Sandbox Code Playgroud)
扩展到
ls -l `grep -l psycopg `find . -name '*.py'``
Run Code Online (Sandbox Code Playgroud)
现在,会发生什么?答:没什么。bash 提示只是挂起。这是为什么?这可能是一种错误的做事方式,但它曾经奏效。我很确定它可以在 Ubuntu 10.10 或 10.04 之前运行。
我的硬盘中有一堆 ISO 图像,我将它们的全部内容列在一个文本文件中,格式如下:
<immage>.iso, <dir structure>/<filename>.<extension>
Run Code Online (Sandbox Code Playgroud)
例子:
OS Backups.iso, ubuntu-12.04-desktop-i386.iso
OS Backups.iso, xubuntu-12.04-desktop-i386.iso
OS Backups.iso, background/pictures.jpg
Pictures vacation 2011.iso, documents/cost_estimates.xls
Pictures vacation 2011.iso, italy/img1.jpg
Pictures vacation 2011.iso, italy/img2.jpg
Run Code Online (Sandbox Code Playgroud)
现在我想对该文本文件发出一个 grep 命令来查找名称中包含“图片”的文件。预期结果将是(对于上一个示例):
Pictures vacation 2011.iso
OS Backups.iso, background/pictures.jpg
Run Code Online (Sandbox Code Playgroud)
关于如何使用 grep 完成这样的事情的任何想法?备择方案?谢谢!
我正在经历奇怪的事情(或者更确切地说是表现出对 Linux 的无知)。
我想了解 ping 请求的概率分布,所以我想我会 ping 一些随机站点一段时间,grep 输出以仅保存 ms,然后重定向到一个文件。我这样做。
ping www.doggiedooley.com | grep -o "[[:digit:]]*.[[:digit:]]* ms" > ping.txt
Run Code Online (Sandbox Code Playgroud)
我对这个命令寄予厚望,但即使创建了文件,它也不包含任何内容,即使过了一段时间也是如此。如果我删除重定向,则会显示输出。我什至可以将输出成功重定向到另一个终端。
ping www.doggiedooley.com | grep -o "[[:digit:]]*.[[:digit:]]* ms" > /dev/pts/1
Run Code Online (Sandbox Code Playgroud)
为什么第一个命令不能正常工作?
我有几台 Ubuntu 服务器,有些行为让我很好奇。
在任何新安装的机器(Ubuntu Server 12.04.3 LTS)上,如果我运行:
echo "testbla123" | grep -P -o [0-9]*
Run Code Online (Sandbox Code Playgroud)
这将按123预期返回。
在旧机器(Ubuntu Server 12.04.1 LTS)上,如果我运行相同的命令,我什么也得不到,我必须运行:
echo "testbla123" | grep -P -o "[0-9]*"
Run Code Online (Sandbox Code Playgroud)
执行之后apt-get upgrade,它将在正则表达式周围不加引号的情况下执行。
Grep 在两台机器上的版本相同。我尝试比较更新前后的依赖关系一段时间,但运气不佳。
我想知道是否有人知道为什么会发生这种情况?
我是编写脚本的新手。所以我希望这很简单。我正在编写的脚本用于收集系统信息并将其保存为 html 文件。
当我运行时:
sudo lshw -short
Run Code Online (Sandbox Code Playgroud)
它列出了系统上的所有硬件。
当我运行时:
sudo lshw -short | grep processor
Run Code Online (Sandbox Code Playgroud)
它返回(点代表空格)
/0/4 ...........................................processor................................................ AMD FX(tm)-6100 Six-Core Processor"
Run Code Online (Sandbox Code Playgroud)
我的问题是如何删除处理器前面的所有内容。或者我如何只显示“处理器”之后的内容。我尝试了 grep 的其他几个选项,并试图找到一个 awk 命令来工作,但我的尝试失败了。
如果需要更多信息,请告诉我。
我知道这是一个看似奇怪的问题,但我想更好地理解使用 Linux 实用程序,所以我将要求一些对我来说似乎相当复杂的东西来更好地理解工作中的机制。
考虑到我们系统中的所有头文件,我如何在终端中显示基于其中定义的宏数量的这些文件的排序列表?
我在结合 ls 和 grep 时遇到了一些麻烦。问题是我必须只使用 ls 和 grep 来列出主目录中的所有文件。我尝试了多种组合,但没有效果。我想我应该像这样使用它:
ls /home/mydir | grep stomething
Run Code Online (Sandbox Code Playgroud)
下一个问题是(不知道怎么做)如何使用 ls 和另一个命令来计算主文件夹中的目录数?
刚刚掌握了 Linux 命令行的窍门,但在使用 grep 命令时遇到了麻烦。
我试图找出一个单词在文本文件的最后 1000 行中出现的次数
我有一种感觉,我需要使用 grep 和管道,但无法弄清楚
运行时这里似乎很奇怪
service --status-all | grep mysql
Run Code Online (Sandbox Code Playgroud)
为什么我得到这么多错误的结果?
它在我得到的 Centos 上运行良好:
mysql is running xxxxxxx
Run Code Online (Sandbox Code Playgroud)
这就是我在 Ubuntu 上得到的:
我有一个文件,看起来像
SPT-CL J0000-5748 J000106.23-574536.8 0.275980 -57.760231 0.7554 0.0003 template 1
SPT-CL J0000-5748 J000049.27-574637.3 0.205320 -57.777050 0.7018 0.0002 template 1
SPT-CL J0000-5748 J000059.24-574759.6 0.246850 -57.799889 0.7059 0.0002 template 1
SPT-CL J0000-5748 J000107.36-574648.7 0.280680 -57.780209 0.6981 0.0002 template 1
Run Code Online (Sandbox Code Playgroud)
几千行。我需要所有的SPT-CL J0000-5748变成SPT-CLJ0000-5748. 我怎样才能通过 快速做到这一点bash?