Linux/Linux 下如何检索文件内容

Linux/Linux 下如何检索文件内容

管道操作符:|

可以将指令连接起来,前一个指令的输出作为后一个指令的输入 find ~ | grep "test" 的作用是在当前目录以及子目录中查找文件名包含 test 的文件以及文件夹,与 find ~ -name "test" 作用相同。

阅读更多
Linux/Linux 下 使用 find 命令 查找文件以及文件夹

Linux/Linux 下 使用 find 命令 查找文件以及文件夹

find 后面第一个参数是要查找的目录,find 命令会在指定的目录以及子目录下面去查询文件 -name 后面接文件名,表示按照名字来查找文件和文件夹。 例如我在 ~/test/ 目录下面有一个文件 test3.java,那就可以在 ~ 目录下面 执行如下查找语句,查找出所有名字为 test3.java 的文件
阅读更多
Linux/Linux 下使用 sed 批量替换文本内容

Linux/Linux 下使用 sed 批量替换文本内容

sed 命令的全名是 stream editor,是 Linux 上非常强大的流编辑器,适用于对文本的行内容进行处理。 下面是一个例子:


Test.java文件中有 3 行代码,如上图所示,想要把每行开头的Str替换为String,使用sed 's/^Str/String/' Test.java

阅读更多
Linux/使用 awk 对日志内容做统计

Linux/使用 awk 对日志内容做统计

awk 是一个行编辑器,说明如下: - 一次读取一行文本,按照输入分隔符进行切片,,默认分隔符为空格,切成多个组成部分(多个切片) - 将切片直接保存在内建的变量中,$1、$2...($0 表示一整行) - 支持对单个切片的判断,支持循环判断
下面是使用 netstat -ntlp 查看网络状态
阅读更多
Linux/虚拟机 Centos 配置 IP 地址
Linux/Linux 后台运行脚本

Linux/Linux 后台运行脚本

直接运行后台任务

我们经常需要在 Linux 服务器上执行一些耗时比较长的操作,比如深度学习的模型训练。但是我们平时在 Linux 上运行的程序可能需要和用户进行交互,例如允许让用户输入,然后输出结果也打印到交互命令行上。这种方式比较适合运行一些简单的命令。但这种模式的缺点是,一旦当前的交互命令行退出,程序就停止运行了。这就要求我们在与服务器断开连接之后,依然能够在 Linux 后台运行脚本。这里先给出一个比较完美的写法。

假设你的脚本是 train.py,你想保存的输出文件为 train.log,那么使用如下语句:

1
nohup python -u train.py > train.log 2>&1 &

nohup命令的意思是 no hang up(不挂起),也就是说,当前交互命令行退出的时候,程序还会执行。

python -u 中的 -u参数是使得python不启用缓冲。默认情况下代码中的输出语句的内容不会立刻被写入 train.log,而是先会存储在缓冲区中,等到一定时机再写入train.log。使用-u参数会关闭缓冲,输出立刻被写入文件。

> train.log 表示把标准输出 (STDOUT) 重定向到train.log中。这样,在代码中使用print打印的字符都会保存在train.log中。

2>&1 中,1表示文件描述符 1,表示标准输出,2表示文件描述符 2,意思是标准错误输出,0表示标准输入。2>&1表示标准输出和错误输出合并了,将错误输出重定向到标准输出。因为标准错误输出 (STDERR) 没有缓冲区,而标准输出有。这就会导致STDOUT > train.logSTDERR > train.log 分别执行,train.log文件被两次打开写入,而标准输出和错误输出将会竞争覆盖,会出现不可控的问题。

最后的&是指后台运行。

当任务被 & 到后执行时,使用exit或者logout正常登出只会结束前台命令,并不会终止后台任务。但如果你直接关闭会话窗口或者意外断网,系统都会向当前会话下的进程发送 SIGHUP 信号。而进程对此信号的默认处理方式是退出执行。具体来说:终端意外、、关闭时,SIGHUP 信号被发送到 session 首进程以及作为 job 提交的进程(即用 & 符号提交的进程)。此时即便你的命令在最后添加了 & ,终端断开连接时仍然会被 SIGHUP 信号中断。

所以最开始的nohup命令可以使得任务忽略 SIGHUP 信号,即使终端断开连接,程序还是会继续执行。

把前台任务转换为后台任务

当运行任务后,使用ctrl+z可以暂停任务。这时使用jobs可以查看任务运行状态,使用bg可以将任务后台运行。

下面的例子时输入yes命令,输入该命令后,会循环打印y,然后ctrl+z暂停任务,使用jobs查看,再使用bg将该命令转为后台运行。

1
2
3
4
5
6
7
8
# 循环打印`y`
yes
# 将任务暂停
ctrl+z
# 查看任务,输出是:
jobs
# 后台运行任务
bg

执行jobs结果如下:


其中前面的数字表示任务编号,目前只有一个任务,处于suspended状态。

bg后面可以加任务编号,默认是将最新的任务挂载到后台任务队列。

先运行命令yes,然后ctrl+z;再运行cat,然后ctrl+zcat命令不加任务参数的作用是阻塞终端,等待你输入字符串并回显相同的字符串。

1
2
3
4
5
6
yes
# 循环打印`y`
yes
# 将任务暂停
ctrl+z
cat

再使用jobs显示如下:


这时有两条命令都是处于suspended状态。如果想让第二条命令后台运行,则执行bg %2

fg是把一个后台运行的任务转到前台运行,用法类似。

如果想把一个正在运行的前台任务转为后台任务,首先执行ctrl+z,然后使用jobs查看任务号,这里假设为 1,再使用bg %1将任务放入后台运行。但此时这个任务还不会忽略 SIGHUP 信号,使用disown -h %1设置该任务忽略 SIGHUP 信号。

总结

  • exitlogout正常登出并不会终止 & 的后台任务,此时的 SIGHUP 信号只会发给前台任务

  • 关闭窗口或断网,前后台任务都会收到 SIGHUP 信号,使用nohup则可以屏蔽此信号,让任务仍不被中断。

  • 进程收到 SIGHUP 信号时默认的操作是退出执行。但我们可以在代码里使用信号捕捉的方法,捕捉或忽略 SIGHUP 信号的处理,这样进程就不会退出了。

参考

Linux/Linux 统计某个文件夹的文件数量

Linux/Linux 统计某个文件夹的文件数量

ls -l命令可以列出当前目录的文件详细信息。


有时文件太多,我们想统计当前目录下有多少个文件时。可以配合使用wc命令。

wc命令可以计算文件的Byte数、字数、或是行数。参数如下:

  • -c 或 --byte s或 --chars 只显示 Bytes 数。
  • -l 或-- lines 显示行数。
  • -w 或 --words 显示字数。

这里我们统计行数,也就是行数,因此配合管道符,使用wc -l


但是统计的行数,既包括了文件,又包括了文件夹。我们知道ls -l的结果中,如果是文件夹则以d开头;如果是文件,则以-开头,因此可以利用这个规则来筛选文件或者文件夹。ls -l | grep "^d"可以利用正则表达式^d来筛选以d开头的行。


然后在这个基础上再统计文件夹数量ls -l | grep "^d" | wc -l


同理,如果只想统计文件数量,那么正则表达式应该使用^-,完整命令为ls -l | grep "^-" | wc -l


如果想要统计当前目录包括子目录下的所有文件,则使用ls -lR | grep "^-" | wc -l


参考

Linux统计文件夹下的文件数目