Bash 操作查询
如何统计当前目录下的文件数量?
要统计只包含当前目录的文件数量(不包括子目录),可以使用 ls、grep 和 wc 这几个命令的组合。
1 | ls -l | grep "^-" | wc -l |
ls -l:以长格式列出当前目录下的所有文件和目录。grep "^-":过滤ls -l的输出,只保留以-开头的行。在长格式列表中,-代表这是一个文件。wc -l:统计过滤后的行数,即文件的总数。
如果你想同时统计子目录中的所有文件,find 命令会更有效:
1 | find . -type f | wc -l |
find .:从当前目录(.)开始查找。-type f:指定查找类型为文件(f)。wc -l:统计找到的文件总数。
如何只显示目录列表中的第一个文件?
可以使用 ls 和 head 命令配合来完成。
使用 ls -1 选项,它会让每个文件单独占一行。然后通过管道传递给 head -n 1,就可以只获取第一行。
1 | ls -1 | head -n 1 |
另一种方法是使用 ls -m 选项,它会用逗号分隔的方式列出文件。同样,结合 head 也能达到目的。
1 | ls -m | head -n 1 |
如何将一个 JSONL 文件中的每一行复制多遍?
使用 awk 命令可以轻松实现这个功能。下面的例子将 your_input.jsonl 文件中的每一行都复制 5 遍,然后输出到 your_output.jsonl 文件中。
1 | awk '{for (i=1; i<=5; i++) print}' your_input.jsonl > your_output.jsonl |
如何搜索文件中的特定文本,并显示文件名和行号?
grep 命令是完成这项任务的最佳工具。
要在当前目录下所有文件中搜索“Hello World!”,并显示文件名和对应的行号,可以使用 -H(显示文件名)和 -n(显示行号)这两个参数。
1 | grep -Hn "Hello World!" * |
如果你想搜索包含“Hello World!”但不包含“XXX”的行,可以将结果通过管道传递给另一个 grep,并使用 -v(反向匹配)参数。
1 | grep -Hn "Hello World!" * | grep -v "XXX" |
如何批量结束所有与某个程序相关的进程?
如果要结束所有正在运行的 Python 脚本,可以结合 ps、grep、awk 和 xargs 这几个命令。
1 | ps -ef | grep python | grep -v grep | awk '{print $2}' | xargs kill -9 |
ps -ef:列出所有正在运行的进程。grep python:从中筛选出包含“python”关键字的进程。grep -v grep:这一步非常关键,它用于排除grep命令本身,避免其被误杀。awk '{print $2}':打印出进程列表中的第二列,即进程 ID(PID)。xargs kill -9:将awk输出的 PID 作为参数传递给kill -9命令,强制终止这些进程。
查找 a.txt 中每行出现「key」的次数,必须要等于 2 次
1 | awk '/key/{count++} END {print count}' a.txt | grep -c '^2$' |
- awk ‘/key/{count++} END {print count}’ a.txt: 这个命令使用 awk 来统计每行中“key”出现的次数。
- /key/: 这是一个正则表达式,匹配包含“key”的行。
- count++: 对于匹配到的每一行,计数器 count 加 1。
- END {print count}: 在处理完所有行后,打印每行“key”出现的总次数。 注意,这里是每行出现的总次数,而不是所有行加起来的总次数。
- grep -c ‘^2$’: 这个命令使用 grep 过滤 awk 的输出,并统计匹配的行数。
- '^2 表示行尾。 因此,这个正则匹配只包含数字 2 的行。 因为awk输出的是每行“key”出现的次数,所以这里匹配2表示出现了两次的行。
- -c: grep 的 -c 选项表示统计匹配到的行数。