常用Linux命令行trick积累

常用Linux命令行trick积累

这个也是平常自己积累用的,不定时更新。把一些常用的又能提高工作效率的命令行总结起来。

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

Linux下有三个命令:ls、grep、wc。通过这三个命令的组合可以统计目录下文件及文件夹的个数。

统计当前目录下文件的个数(不包括目录)
$ ls -l | grep “^-” | wc -l
统计当前目录下文件的个数(包括子目录)
$ ls -lR| grep “^-” | wc -l
查看某目录下文件夹(目录)的个数(包括子目录)
$ ls -lR | grep “^d” | wc -l
命令解析:

ls -l
长列表输出该目录下文件信息(注意这里的文件是指目录、链接、设备文件等),每一行对应一个文件或目录,ls -lR是列出所有文件,包括子目录。

grep “^-“
过滤ls的输出信息,只保留一般文件,只保留目录是grep “^d”。

命令编辑及光标移动

这里有很多快捷键可以帮我们修正自己的命令。接下来使用光标二字代替光标的位置。
删除从开头到光标处的命令文本
ctrl + u,例如:
cd /proc/tty;ls -al光标
复制代码如果此时使用ctrl + u快捷键,那么该条命令都会被清除,而不需要长按backspace键。
删除从光标到结尾处的命令文本
ctrl+k,例如:
cd /proc/tty光标;ls -al
复制代码如果此时使用ctrl + k快捷键,那么从光标开始处到结尾的命令文本将会被删除。
还有其他的操作,不再举例,例如:

ctrl + a:光标移动到命令开头
ctrl + e:光标移动到命令结尾
alt f:光标向前移动一个单词
alt b:光标向后移动一个单词
ctrl w:删除一个词(以空格隔开的字符串)

linux中删除特殊名称文件的方式

说明一下linux中文件命名规则。文件或目录名由除“/”和空字符“\0”之外的任意ASCII字符序列组成。当然很多操作系统允许更多类型的字符组成文件名。但对于我们来说,从来不建议使用一些特殊字符来命名文件。不幸的是,我们可能无意中创建了一些特殊名称的文件,或者由程序意外的创建了一些由特殊字符组成的文件。

假设有一个名为-static文件,我们使用普通方式将它删除:

$ rm -static
rm: invalid option — ‘s’
Try ‘rm ./-static’ to remove the file ‘-static’.
Try ‘rm –help’ for more information.
这种方式提示出错,并不能成功地删除-static文件。这是为什么?我们知道在linux中,通常以-开头,后面跟一些字符,作为一个命令的选项,而不巧的,-static就被rm命令认为是一个参数选项,更不幸的是,实际上并没有该选项,因此最终提示invalid option — ‘s’,导致-static文件无法删除。

$ rm ./-static
最终发现,我们将-static文件成功删除了。因此可以删除文件时带上路径

清空文件内容

比如有一个大文件,你想快速删除,或者不想删除,但是想清空内容:

>filename

计算程序运行时间

我们可能会进程写一些小程序,并且想要知道它的运行时间,实际上我们可以很好的利用time命令帮我们计算,例如:
$ time ./fibo 30
the 30 result is 832040

real 0m0.088s
user 0m0.084s
sys 0m0.004s
复制代码它会显示系统时间,用户时间以及实际使用的总时间。

查看内存占用前10的进程

$ ps -aux|sort -k4nr |head -n 10

搜索包含某个字符串的文件

例如,要在当前目录下查找包含test字符串的文件:
$ grep -rn “test”
test2.txt:1:test
复制代码它便可以找到该字符串在哪个文件的第几行。

屏幕冻结

程序运行时,终端可能输出大量的日志,你想简单查看一下,又不想记录日志文件,此时可以使用ctrl+s键,冻结屏幕,使得日志不再继续输出,而如果想要恢复,可使用ctrl+q退出冻结。

无编辑器情况下编辑文本文件

如果在某些系统上连基本的vi编辑器都没有,那么可以使用下面的方式进行编辑内容:

$ cat >file.txt

编辑完成后,ctrl+d即可保存。

退出当前 Bash Shell 并不保存历史的 5 种方法

某些时候我们希望在退出 Bash Shell 的时候不要保存执行命令的历史记录,那么可以用以下几种方法来实现:

先说两个不影响以前的历史记录的方法:

1. 修改 HISTFILE 变量
unset HISTFILE && exit

2. 直接 Kill 当前 Shell
kill -9 $$

下面三个方法会清除所有的记录:

3. 清除历史记录并退出
history -c && exit
4. 设置历史记录保存数量为 0 条并退出
HISTSIZE=0 && exit

5. 删除历史记录文件并修改 HISTFILE 变量
rm -f $HISTFILE && unset HISTFILE && exit
如果你想每次都自动执行这些命令,可以在将对应的指令添加到 ~/.bash_logout 文件中,或者使用 alisa 功能。

如何在Linux中运行具有时间限制(Timeout)的命令

timeout 是指运行指定的命令,如果在指定时间后仍在运行,则杀死该进程。用来控制程序运行的时间。

其语法如下:

timeout [OPTION] DURATION COMMAND [ARG]…
要使用该命令,请使用要运行的命令指定超时值(以秒为单位)。例如,要在5秒钟后使ping命令自动终止,你可以运行以下命令。

# timeout 5s ping google.com
你不必在数字5之后指定(s),默认是是秒为单位,下面的命令是相同的,并且仍然可以使用,同样是终止ping命令。

# timeout 5 ping google.com

其他后缀包括:m 代表分钟,h 代表小时,d 代表天

Linux查看进程运行的完整路径方法

通过ps及top命令查看进程信息时,只能查到相对路径,查不到的进程的详细信息,如绝对路径等。这时,我们需要通过以下的方法来查看进程的详细信息:

Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的文件夹,在该文件夹下会有我们的进程的信息,其中包括一个名为exe的文件即记录了绝对路径,通过ll或ls –l命令即可查看。

ll /proc/PID

cwd符号链接的是进程运行目录;

exe符号连接就是执行程序的绝对路径;

cmdline就是程序运行时输入的命令行命令;

environ记录了进程运行时的环境变量;

fd目录下是进程打开或使用的文件的符号连接。

清除 SSH 登录记录

SSH 登录日志以二进制方式存储在下面文件内,需要使用对应命令查看,不然会显示乱码。

日志文件查看命令日志内容
/var/log/wtmplast登录成功日志,包含用户名、IP 地址和时间记录
/var/log/btmplastb登录失败日志,包含信息同上
/var/log/lastloglastlog各用户的最近登录日志
/var/log/securecat查看各类需要输入口令的登录日志

清除 SSH 登录日志使用下面命令。

cat /dev/null > /var/log/wtmp
cat /dev/null > /var/log/btmp
cat /dev/null > /var/log/lastlog
cat /dev/null > /var/log/secure

清除 Bash 历史命令

Bash 执行过的命令存在用户目录下的 .bash_history 文件里,用 history 命令查看。

history命令用于显示指定数目的指令命令,读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件。该命令单独使用时,仅显示历史命令,在命令行中,可以使用符号!执行指定序号的历史命令。例如,要执行第2个历史命令,则输入!2。

历史命令是被保存在内存中的,当退出或者登录shell时,会自动保存或读取。在内存中,历史命令仅能够存储1000条历史命令,该数量是由环境变量HISTSIZE进行控制。

清除所有历史命令记录,并立即更新日志文件。

history -c && history -w

如果只需清除当前会话用过的命令记录,用 history -r 命令清除(因为当前命令记录还在缓冲区中,-r 从文件中覆盖当前的缓冲区,此时history显示的就是此前的历史记录了)。

在没有鼠标的情况下复制文本

可以使用GNU屏幕的复制和粘贴命令。
快速教程:
打开屏幕:screen(orscreen myprog my args here)
运行程序,生成要复制的输出
进入复制模式:Control+A+[
将光标移到起点
按Enter键
将光标移动到终点
按Enter键
粘贴:Control+A+]
屏幕比这个功能强大得多(我使用它来标记几个虚拟终端,而不需要一个特殊的终端模拟器,而且还可以在X崩溃或其他情况下不释放会话)。

获取指定pid的ppid

ps -o ppid -p [要查询的pid]

linux查看进程中的线程

线程是现代操作系统上进行并行执行的一个流行的编程方面的抽象概念。当一个程序内有多个线程被叉分出用以执行多个流时,这些线程就会在它们之间共享特定的资源(如,内存地址空间、打开的文件),以使叉分开销最小化,并避免大量高成本的IPC(进程间通信)通道。这些功能让线程在并发执行时成为一个高效的机制。

在Linux中,程序中创建的线程(也称为轻量级进程,LWP)会具有和程序的PID相同的“线程组ID”。然后,各个线程会获得其自身的线程ID(TID)。对于Linux内核调度器而言,线程不过是恰好共享特定资源的标准的进程而已。经典的命令行工具,如ps或top,都可以用来显示线程级别的信息,只是默认情况下它们显示进程级别的信息。

这里提供了在Linux上显示某个进程的线程的几种方式。

ps -T -p <pid>

“SID”栏表示线程ID,而“CMD”栏则显示了线程名称。

top -H

top命令可以实时显示各个线程情况。要在top输出中开启线程查看,请调用top命令的“-H”选项,该选项会列出所有Linux线程。在top运行时,你也可以通过按“H”键将线程查看模式切换为开或关。

要让top输出某个特定进程<pid>并检查该进程内运行的线程状况:

top -H -p <pid>

Htop

一个对用户更加友好的方式是,通过htop查看单个进程的线程,它是一个基于ncurses的交互进程查看器。该程序允许你在树状视图中监控单个独立线程。

要在htop中启用线程查看,请开启htop,然后按<F2>来进入htop的设置菜单。选择“设置”栏下面的“显示选项”,然后开启“树状视图”和“显示自定义线程名”选项。按<F10>退出设置。

现在,你就会看到下面这样单个进程的线程视图。

Linux 两个文件求交集、并集、差集 

有 a.txt 和 b.txt 两个文件,内容如下。

[root@VM-4-7-centos test]# cat a.txt 
1111
2222
3333
4444
4444
[root@VM-4-7-centos test]# cat b.txt 
3333
4444
5555
6666

交集

[root@VM-4-7-centos test]# sort b.txt a.txt | uniq -d
3333
4444

将a.txt b.txt文件进行排序,uniq使得两个文件中的内容为唯一的,使用-d输出两个文件中次数大于1的内容,即是得到交集。

并集

[root@VM-4-7-centos test]# sort a.txt b.txt | uniq 
1111
2222
3333
4444
5555
6666

将a.txt b.txt文件进行排序,uniq使得两个文件中的内容为唯一的,即可得到两个文件的并集。

差集

a.txt-b.txt:

[root@VM-4-7-centos test]# sort a.txt b.txt b.txt | uniq -u
1111
2222

将两个文件排序,最后输出a.txt b.txt b.txt文件中只出现过一次的内容,因为有两个b.txt所以只会输出只在a.txt出现过一次的内容,即是a.txt-b.txt差集。-u表示的是输出出现次数为1的内容。

b.txt – a.txt:

[root@VM-4-7-centos test]# sort b.txt a.txt a.txt | uniq -u
5555
6666

对于b.txt-a.txt为同理。

赞赏

微信赞赏支付宝赞赏

Zgao

愿有一日,安全圈的师傅们都能用上Zgao写的工具。

发表评论