Linux常用命令汇总
用户管理
创建用户
useradd
只是创建一个用户名,命令如下:
1  | sudo useradd username  | 
它并没有在/home目录下创建同名文件夹,也没有创建密码,因此利用这个用户登录系统,是登录不了的,为了避免这样的情况出现,可以添加-m参数创建:
1  | sudo useradd username -m  | 
它会在/home目录下创建同名文件夹,然后利用sudo passwd username为指定的用户名设置密码。
adduser
这个命令实际是一个perl脚本,是useradd等类似底层命令的更友好的前端,它会用交互性的方式建立新用户,使用它可以指定新用户的家目录,登录密码,是否加密主目录等等,它会:
- 建立一个新目录作为家目录
 - 建立同名新组
 - 把用户的主要组设为该组(除非命令选项覆盖以上默认动作,比如–disall-homdirecry之类)
 - 从/etc/SKEL目录下拷贝文件到家目录,完成初始化
 - 建立新用户的密码
 - 如果其存在的话,还会执行一个脚本
 
1  | sudo adduser username  | 
删除用户
通过userdel命令即可:
1  | sudo userdel -r username  | 
-r:删除/home/路径下的用户文件夹
添加root权限
/etc/sudoers
该文件只能由root用户处理,其中包含了root权限的具体信息,具体可以参见linux /etc/sudoers 文件说明,其中信息有:
1  | # User privilege specification  | 
- 
root用户具有root权限
- 
root用户可以在任何可能出现的主机名的系统中,在任何用户任何组中执行任何命令
 - 
文件格式
1
2
3# useralias (用户名) hostalias (可以从哪些机器登陆) = (用户:用户组)"以什么用户,什么组" cmndalias "执行什么命令"
useralias hostalias = (username:group) cmndalias
%FOO ALL = (ALL) NOPASSWD:ALL,!/usr/sbin/NOPASSWD:ALL:不用输入密码执行任何命令%:表示用户组!:表示禁止执行
 
 - 
 - 
admin组和sudo组中的用户均具有root权限
- 
查看当前用户组:
1
id username
 - 
添加到root权限组:
1
2
3# usermod -a -G group -s /bin/bash username
usermod -a -G sudo -s /bin/bash username
usermod -a -G admin -s /bin/bash username - 
从指定组中移除用户:
1
gpasswd -d username group
 
 - 
 
/etc/sudoers.d/*
该文件夹下的内容和/etc/sudoers中的类似,通过如下方式可以添加root用户:
1  | echo "username ALL=(ALL) ALL" >> /etc/sudoers.d/username  | 
压缩解压类
tar
1  | tar [-cxtzjvfpPN] 文件与目录 ....  | 
参数:
- 压缩与解压(以下三个仅能存在一个,不能同时存在)
-c:建立一个压缩文件的参数指令(create)-x:解开一个压缩文件的参数指令-t:查看 tarfile 里面的文件
 - 压缩与解压类型
-z:是否同时具有 gzip 的属性?即是否需要用 gzip 压缩?(.tar.gz、.tgz)-j:是否同时具有 bzip2 的属性?即是否需要用 bzip2 压缩?(.tar.bz2、.tar.bz)
 -v:压缩的过程中显示文件-f:使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数- -p :使用原文件的原来属性(属性不会依据使用者而变)
 - -P :可以使用绝对路径来压缩
 - -N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中
 - –exclude FILE:在压缩的过程中,不要将 FILE 打包
 
范例:
1  | 范例一:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar  | 
其他常用类型
.tar
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
.zip
解压:unzip FileName.zip
压缩:zip FileName.zip DirName
.rar
解压:rar x FileName.rar
压缩:rar a FileName.rar DirName
.gz
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName
.tar.gz 和 .tgz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName
.bz2
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName
.tar.bz2
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName
.bz
解压1:bzip2 -d FileName.bz
解压2:bunzip2 FileName.bz
压缩:未知
.tar.bz
解压:tar jxvf FileName.tar.bz
压缩:未知
.Z
解压:uncompress FileName.Z
压缩:compress FileName
.tar.Z
解压:tar Zxvf FileName.tar.Z
压缩:tar Zcvf FileName.tar.Z DirName
.lha
解压:lha -e FileName.lha
压缩:lha -a FileName.lha FileName
.rpm
解包:rpm2cpio FileName.rpm | cpio -div
.deb
解包:ar p FileName.deb data.tar.gz | tar zxf -
gzip 命令
语法:gzip [选项] 压缩(解压缩)的文件名
- -c 将输出写到标准输出上,并保留原有文件
 - -d 将压缩文件解压
 - -l 对每个压缩文件,显示下列字段
- 压缩文件的大小
 - 未压缩文件的大小
 - 压缩比
 - 未压缩文件的名字
 
 - -r 递归式地查找指定目录并压缩其中的所有文件或者是解压缩
 - -t 测试,检查压缩文件是否完整
 - -v 对每一个压缩和解压的文件,显示文件名和压缩比
 - -num 用指定的数字 num 调整压缩的速度,-1 或 --fast 表示最快压缩方法(低压缩比),-9 或–best表示最慢压缩方法(高压缩比)。系统缺省值为 6
 
硬件信息查询
内核和版本
1  | uname -a  | 
位数
1  | # 通过字节长度区分  | 
- 32位的系统中int类型和long类型一般都是4字节,64位的系统中int类型还是4字节的,但是long已变成了8字节
 - linux系统中可用"
getconf WORD_BIT"和"getconf LONG_BIT"获得word和long的位数。64位系统中应该分别得到32和64 
硬件信息
1  | # 全部信息  | 
logo
1  | # 需要提前安装 二选一即可  | 
后台运行
参考资料:Linux 守护进程的启动方法
后台执行
一般运行linux上的程序执行 .sh 文件(./sh文件)时都会影响当前CMD窗口的操作,如果需要后台运行则需要借助 nohup 和 & 命令来实现。
1  | nohup java -server -Xms128M -Xmx512M -XX:MetaspaceSize=128M -jar test.jar $1 $2 $3 &  | 
nohup:加在一个命令的最前面,表示不挂断的运行命令&:加在一个命令的最后面,表示这个命令放在后台执行
nohub做了以下:
- 阻止
 SIGHUP信号发到这个进程。- 关闭标准输入。该进程不再能够接收任何输入,即使运行在前台。
 - 重定向标准输出和标准错误到文件
 nohup.out。注意,
nohup命令不会自动把进程变为"后台任务",所以必要时需要加上&符号
查看后台
ps 和 jobs都可以用于查看后台程序:
jobs:只能查看当前终端后台执行的任务,换了终端就看不见了ps:适用于查看瞬时进程的动态,可以看到别的终端的任务
jobs:
1  | [root@localhost test]# jobs  | 
- “+”:最近的一个任务(当前任务)
 - “-”:之前的任务
 
只有在当前命令行中使用
nohup和&时,jobs命令才能将它显示出来。如果将他们写到 .sh 脚本中,然后执行脚本,是显示不出来的
ps:
这个是查看进程常用的命令,不多说了。
1  | [root@localhost test]# ps -aux|grep java  | 
- a:显示所有程序
 - u:以用户为主的格式来显示
 - x:显示所有程序,不以终端机来区分
 
关闭后台程序
kill 命令:
- 通过
jobs命令查看jobnum,然后执行kill %jobnum - 通过
ps命令查看进程号PID,然后执行kill %PID 
如果是前台进程的话,直接执行Ctrl+C就可以终止了
前后台切换
- 
fg命令:将后台中的命令调至前台继续运行。如果后台中有多个命令,可以先用jobs查看jobnun,然后用fg %jobnum将选中的命令调出。 - 
Ctrl + Z命令:将一个正在前台执行的命令放到后台,并且处于暂停状态 - 
bg命令:将一个在后台暂停的命令,变成在后台继续执行如果后台中有多个命令,可以先用jobs查看jobnum,然后用 bg %jobnum 将选中的命令调出继续执行。
 
screen
借助GUN的screen也能够很好的实现后台运行功能。GNU Screen简称Screen或screen,源自GNU计划,其官网为:GNU Screen
screen的功能大体有三个:
- 会话恢复:**只要Screen本身没有终止,在其内部运行的会话都可以恢复。**这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen -r就可以恢复会话的运行。同样在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。
 - 多窗口:在Screen环境下,**所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。**用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。
 - 会话共享:Screen可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出,但是不能多个用户同时登录一个会话)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。
 
首先需要先安装screen:
1  | sudo apt install screen  | 
通常情况下,screen创建的虚拟终端,有两个工作模式:
- Attached:表示当前screen正在作为主终端使用,为活跃状态。此状态下其他用户不能接入
 - Detached:表示当前screen正在后台使用,为非激发状态。此状态可以随意接入
 
一般来说只需要以下命令即可:
1  | # 查询screen提示  | 
在虚拟终端内,输入 Ctril + a 将等待接受预先设置的绑定键,这个时候可以输入对应的一些命令,来操作虚拟终端,如:
- d:保存会话,后台运行该虚拟终端,即将该虚拟终端状态设为 Detached
 - k:关闭对话,等同输入:
exit - c:新建一个虚拟终端
 - ?:显示所有绑定键盘
 
端口相关
查看端口
lsof
lsof命令(lists openfiles)用于查看进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。
在linux下,任何事物都以文件的形式存在,这其中包括各种网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
选项:
1  | -a:列出打开文件存在的进程;  | 
查看端口号:
1  | lsof -i:端口号  | 
netstat
netstat命令用来打印Linux中网络系统的状态信息,可以得知整个Linux系统的网络情况
选项:
1  | -a或--all:显示所有连线中的Socket;  | 
例子:
1  | netstat -a #列出所有端口  | 
检测远程端口
telnet
telnet命令用于登录远程主机,对远程主机进行管理。
参数:
- 远程主机:指定要登录进行管理的远程主机;
 - 端口:指定TELNET协议使用的端口号。
 
选项:
1  | -8:允许使用8位字符资料,包括输入与输出;  | 
能够通过该命令间接访问某个端口是否开放:
1  | telnet ip地址 端口号  | 
nmap
nmap命令是一款开放源代码的网络探测和安全审核工具,它的设计目标是快速地扫描大型网络(包括端口号、状态以及对应的服务)。
参数:
- ip地址:指定待扫描报文中的TCP地址。
 
选项:
1  | -O:激活操作探测;  | 
例子:
1  | nmap 192.168.1.102 # 扫描对应ip的端口号开放情况以及对应的服务  | 
nc
nc命令是netcat命令的简称,都是用来设置路由器。
参数:
- 主机:指定主机的IP地址或主机名称;
 - 端口号:可以是单个整数或者是一个范围。
 
选项:
1  | -g<网关>:设置路由器跃程通信网关,最多设置8个;  | 
例子:
1  | nc -w 5 211.100.98.99 80 && echo ok ||echo no #判断对应端口是否开放  | 
开放指定端口
Ubuntu下,首先检测防火墙状态,如果打开需要开放指定端口:
1  | sudo ufw status # 查询状态  | 
配置iptables,开放对应端口:
1  | sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT # 开放输入tcp的80端口  | 
- iptables规则设置后是即时生效的,在机器重启后
iptables中的配置信息会被清空 
文本处理
Linux 操作文本的三大利器分别是 grep、sed 、awk,简称三剑客。
大师兄 awk:最擅长取列;二师兄 sed:最擅长取行;三师兄 grep:最擅长过滤。
awk
参考链接:AWK 官方手册、Linux awk 命令、awk实例一:简单入门、AWK 简明教程
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
Awk通常被用来进行格式扫描和处理。通过扫描一个或多个文件中的行,查看是否匹配指定的正则表达式,并执行相关的操作。主要由以下特点:
- Awk以记录和字段的方式来查看文本文件
 - 和其他编程语言一样,Awk 包含变量、条件和循环
 - Awk能够进行运算和字符串操作
 - Awk能够生成格式化的报表数据
 
Awk从一个文件或者标准输入中读取数据,并输出结果到标准输出中
语法:
1  | awk [选项参数] 'script' var=value file(s)  | 
工作方式
- Awk 一次读取文件中的一行
 - 对于一行,按照给定的正则表达式的顺序进行匹配,如果匹配则执行对应的 Action
 - 如果没有匹配上则不执行任何动作
 - 在上诉的语法中, Search Pattern 和 Action 是可选的,但是必须提供其中一个
 - 如果 Search Pattern 未提供,则对所有的输入行执行 Action 操作
 - 如果 Action 未提供,则默认打印出该行的数据
 - {} 这种 Action 不做任何事情,和未提供的 Action 的工作方式不一样
 - Action 中的语句应该使用分号分隔
 
运算符
| 运算符 | 描述 | 
|---|---|
| = += -= *= /= %= ^= **= | 赋值 | 
| ?: | C条件表达式 | 
| || | 逻辑或 | 
| && | 逻辑与 | 
| ~ 和 !~ | 匹配正则表达式和不匹配正则表达式 | 
| < <= > >= != == | 关系运算符 | 
| 空格 | 连接 | 
| + - | 加,减 | 
| * / % | 乘,除与求余 | 
| + - ! | 一元加,减和逻辑非 | 
| ^ *** | 求幂 | 
| ++ – | 增加或减少,作为前缀或后缀 | 
| $ | 字段引用 | 
| in | 数组成员 | 
内建变量
| 变量 | 描述 | 
|---|---|
| $n | 当前记录的第n个字段,字段间由FS分隔 | 
| $0 | 完整的输入记录 | 
| ARGC | 命令行参数的数目 | 
| ARGIND | 命令行中当前文件的位置(从0开始算) | 
| ARGV | 包含命令行参数的数组 | 
| CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 | 
| ERRNO | 最后一个系统错误的描述 | 
| FIELDWIDTHS | 字段宽度列表(用空格键分隔) | 
| FILENAME | 当前文件名 | 
| FNR | 各文件分别计数的行号 | 
| FS | 字段分隔符(默认是任何空格) | 
| IGNORECASE | 如果为真,则进行忽略大小写的匹配 | 
| NF | 一条记录的字段的数目 | 
| NR | 已经读出的记录数,就是行号,从1开始 | 
| OFMT | 数字的输出格式(默认值是%.6g) | 
| OFS | 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符 | 
| ORS | 输出记录分隔符(默认值是一个换行符) | 
| RLENGTH | 由match函数所匹配的字符串的长度 | 
| RS | 记录分隔符(默认是一个换行符) | 
| RSTART | 由match函数所匹配的字符串的第一个位置 | 
| SUBSEP | 数组下标分隔符(默认值是/034) | 
用法
1  | awk '/search pattern1/ {Actions}  | 
- search pattern是正则表达式
 - Actions 输出的语法
 - 在Awk 中可以存在多个正则表达式和多个输出定义
 - file 输入文件名
 - 单引号的作用是包裹起来防止shell 截断
 
关键字 BEGIN 和 END:
1  | BEGIN { Actions}  | 
- 在BEGIN 节中的 Actions 会在读取文件中的行之前被执行
 - 而END 节中的 Actions 会在读取并处理文件中的所有行后被执行
 
例子
创建一个包含下面内容的文本文件employee.txt
1  | $cat employee.txt  | 
- 
默认的时候awk 打印文件中的每一行
1
2
3
4
5
6$ awk '{print;}' employee.txt
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy DBA Technology $6,000 - 
打印匹配的行
1
2
3
4$ awk '/Thomas/
> /Nisha/' employee.txt
100 Thomas Manager Sales $5,000
400 Nisha Manager Marketing $9,500- 每个组合 ( 正则表达式和对应的 Action) 必须用新行来分隔
 
 - 
仅打印指定的域
1
2
3
4
5
6
7
8
9
10
11
12$ awk '{print $2,$5;}' employee.txt
Thomas $5,000
Jason $5,500
Sanjay $7,000
Nisha $9,500
Randy $6,000
$ awk '{print $2,$NF;}' employee.txt
Thomas $5,000
Jason $5,500
Sanjay $7,000
Nisha $9,500
Randy $6,000- $2 和 $5 分别代表名字和薪水
 
 - 
开始和最后的动作
1
2
3
4
5
6
7
8
9
10
11
12$ awk 'BEGIN {print "Name/tDesignation/tDepartment/tSalary";}
> {print $2,"/t",$3,"/t",$4,"/t",$NF;}
> END{print "Report Generated/n--------------";
> }' employee.txt
Name Designation Department Salary
Thomas Manager Sales $5,000
Jason Developer Technology $5,500
Sanjay Sysadmin Technology $7,000
Nisha Manager Marketing $9,500
Randy DBA Technology $6,000
Report Generated
-------------- - 
找出员工 ID 大于 200 的员工
1
2
3
4$ awk '$1 >200' employee.txt
300 Sanjay Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy DBA Technology $6,000 - 
打印技术部员工
1
2
3
4$ awk '$4 ~/Technology/' employee.txt
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
500 Randy DBA Technology $6,000 - 
打印技术部门的员工数
1
2
3
4$ awk 'BEGIN { count=0;}
$4 ~ /Technology/ { count++; }
END { print "Number of employees in Technology Dept =",count;}' employee.txt
Number of employees in Tehcnology Dept = 3 
sed
参考链接:sed官方手册、、Linux sed命令、sed 简明教程
sed全名叫stream editor,流编辑器,用程序的方式来编辑文本,基本上就是玩正则模式匹配。
工作方式
sed在处理时会把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。其伪代码如下:
1  | foreach line in file {  | 
- 注意
-n参数 
命令格式
1  | sed [options] 'command' file(s)  | 
options选项如下:
-e<script>或--expression=<script>:以选项中的指定的script(即后面的command)来处理输入的文本文件;-f<script文件>或--file=<script文件>:以选项中指定的script文件来处理输入的文本文件;-h或--help:显示帮助;-n或--quiet或——silent:仅显示script处理后的结果;-V或--version:显示版本信息。-i:直接修改文件内容
其中,command为处理对应文件的命令,几乎所有的命令都是这样的:
1  | [address[,address]][!]{cmd}  | 
- 
address:可以是一个数字,也可以是一个模式,你可以通过逗号要分隔两个address 表示一个区间 - 
!:匹配成功后是否执行命令 - 
cmd:对应的命令,可以用正则表达式- 
cmd可以是多个,可以用分号分开,也可以用大括号括起来作为嵌套命令
 - 
cmd中可以使用正则表达式:
1
2
3
4
5
6
7
8
9
10
11
12
13^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。
[^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
& 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
\< 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。
\> 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。
x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。
x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。
x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。 - 
基本cmd如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25a\ 在当前行下面插入文本。
i\ 在当前行上面插入文本。
c\ 把选定的行改为新的文本。
d 删除,删除选择的行。
D 删除模板块的第一行。
s 替换指定字符
h 拷贝模板块的内容到内存中的缓冲区。
H 追加模板块的内容到内存中的缓冲区。
g 获得内存缓冲区的内容,并替代当前模板块中的文本。
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l 列表不能打印字符的清单。
n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p 打印模板块的行。
P(大写) 打印模板块的第一行。
q 退出Sed。
b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
r file 从file中读行。
t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
w file 写并追加模板块到file末尾。
W file 写并追加模板块的第一行到file末尾。
! 表示后面的命令对所有没有被选定的行发生作用。
= 打印当前行号码。
# 把注释扩展到下一个换行符以前。- 
g、G、h、H、x命令牵扯到Hold Space,详见sed 简明教程Hold Space章节
 - 
注意,当在要替换的情况下(如上述s命令),可以使用如下标记:
1
2
3
4
5
6
7g 表示行内全面替换。
p 表示打印行。
w 表示把行写入一个文件。
x 表示互换模板块中的文本和缓冲区中的文本。
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\1 子串匹配标记
& 已匹配字符串标记 
 - 
 
 - 
 
command对应的伪代码如下:
1  | bool bexec = false  | 
例子
原始文本:
1  | $ cat pets.txt  | 
sed命令用法:
1  | # 对3行到第6行,执行命令/This/d  | 
grep
参考链接:grep官方手册、grep命令、Linux grep 命令
grep是“global search regular expression and print out the line”的简称,意思是全面搜索正则表达式,并将其打印出来。
grep命令的选项用于对搜索过程的补充,而其命令的模式十分灵活,可以是变量、字符串、正则表达式。
注意:当模式中包含了空格,务必要用双引号将其引起来。
linux系统支持三种形式的grep命令:
grep:即标准grepegrep:简称扩展grep命令,与grep -E等价,支持基本和扩展的正则表达式fgrep:简称快速grep命令,与grep -F等价,不支持正则表达式,按照字符串表面意思进行匹配
命令格式
1  | grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]  | 
- -r 或 --recursive:以递归的方式查找符合条件的文件,并打印出符合条件的行
 - -v 或 --invert-match:反向查找,打印出不符合条件行的内容
 - -i 或 --ignore-case : 忽略字符大小写的差别
 - -H 或 --with-filename : 标出该行所属的文件名称
 - -n 或 --line-number : 标出匹配行的行号
 - –color=auto:标出匹配颜色
 - -c 或 --count : 计算匹配的个数
 
常见形式
1  | # 在当前目录中,查找后缀为 file 的文件中包含 test 的文件,并打印出符合条件的行  | 
其他
补丁
diff
patch
ssh
远程登录命令,基本命令如下:
-l:指定用户名,或者用@表示,如果没有默认当前登录用户名-p:指定端口号-C:ssh传输数据时会进行数据压缩-q:安静模式-T:禁止远程分配终端-n:关闭标准输入-N:不执行远程命令-f:把 ssh 放到后台运行-v:打开调试模式-b:绑定发起ssh连接的ip地址(针对多网卡用户)- 直接跟命令:仅仅远程执行一条命令
 - -L:正向代理
 - -R:反向代理
 - -D:socks5代理
 
正向代理(本地端口转发)
在本地运行,在本地启动端口,把本地端口数据转发到远端
用法:
1  | ssh -L 本地地址:本地端口:目的地址:目的端口 跳转机地址  | 
目的地址与目的端口需要跳转机能够访问,此ip和端口可以在跳转机自己上(localhost)或其他机器上(跳转机能够访问)本地地址和本地端口是本机(即执行该命令的机器)上的- 主要用于
本机访问跳板机能够访问的端口 - 可以加上
-CqTnN参数 
反向代理(远程端口转发)
在远端运行,让远端启动端口,把远端端口数据转发到本地(下面的目标机器)。
用法:
1  | ssh -R 源地址:源端口:目的地址:目的端口 本地机器地址  | 
目的地址与目的端口需要远端机器(即执行该命令的机器)能够访问,同样此ip和端口可以在远端机器自己上(localhost)或其他机器上(本机能够访问)源地址和源端口指本地机器上的ip和端口- 主要用于在内网的
远端机器把自己可以访问的端口暴露给了外网本地机器 - 可以加上
-CqTnN参数 
注意:这里可能需要修改
本地机器的ssh配置文件/etc/ssh/sshd_config,添加:
 1 GatewayPorts yes
socks5代理
用法:
在 HostA 的本地 1080 端口启动一个 socks5 服务,通过本地 socks5 代理的数据会通过 ssh 链接先发送给 HostB,再从 HostB 转发送给远程主机:
1  | HostA$ ssh -D localhost:1080 HostB  | 
那么在 HostA 上面,浏览器配置 socks5 代理为 127.0.0.1:1080,看网页时就能把数据通过 HostB 代理出去,类似 ss/ssr 版本,只不过用 ssh 来实现。
xargs
参考链接:xargs 命令教程- 阮一峰的网络日志
Linux命令都带有参数,有些命令可以接受"标准输入"(stdin)作为参数。这些命令可以和管道|配合使用,管道可以将左侧命令的标准输出转换为标准输入,提供给右侧命令作为参数
但是,大多数命令都不接受标准输入作为参数,只能直接在命令行输入参数,这导致无法用管道命令传递参数
xargs的主要作用是将标准输入转为命令行参数
1  | echo "hello world" | xargs echo  | 
基本格式:
1  | xargs [-options] [command]  | 
- command默认为echo
 
xargs可以单独执行,输入xargs按下回车以后,命令行就会等待用户输入,作为标准输入。可以输入任意内容,然后按下Ctrl d,表示输入结束,这时echo命令(默认command参数)就会把前面的输入打印出来
常用options
-d:指定分隔符- 默认将换行符和空格作为分隔符,把标准输入分解成一个个命令行参数
 
1  | echo -e "a\tb\tc" | xargs -d "\t" echo  | 
-p:打印出要执行的命令,询问用户是否要执行-t:打印出要执行的命令,不需要用户确认
1  | echo 'one two three' | xargs -p touch  | 
由于xargs默认将空格作为分隔符,所以不太适合处理文件名,因为文件名可能包含空格。
但是find命令有一个特别的参数-print0,可以指定输出的文件列表以null分隔,所以可以通过下面参数配合使用:
-0:用null当作分隔符,配合find的print0使用
1  | # 命令删除/path路径下的所有文件(可以处理文件名包含空格的情况)  | 
systemd
Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/lib/systemd/system/,真正的配置文件存放在这个目录中。
systemctl enable命令用于在上面两个目录之间,建立符号链接关系。
1  | $ sudo systemctl enable clamd@scan.service  | 
- 如果配置文件里面设置了开机启动,
systemctl enable命令相当于激活开机启动。 
与之对应的,systemctl disable命令用于在两个目录之间,撤销符号链接关系,相当于撤销开机启动。
1  | $ sudo systemctl disable clamd@scan.service  | 
- 配置文件的后缀名,就是该 Unit 的种类,比如
sshd.socket。如果省略,Systemd 默认后缀名为.service,所以sshd会被理解成sshd.service。 
这里给出一个常用的脚本样例(以sshd.service为例):
1  | [Unit]  | 
- 
注意,在修改配置文件后需要重新载入配置文件并重启相关服务:
1
2
3
4# 重新加载配置文件
$ sudo systemctl daemon-reload
# 重启相关服务
$ sudo systemctl restart xxxx 
常用命令
状态
1  | # 显示系统状态  | 
管理
1  | # 使能一个服务  | 
开机自启demo
首先编写配置文件ipchange.service:
1  | [Unit]  | 
并放在目录/lib/systemd/system/下,之后通过以下命令设置开机自启:
1  | sudo systemctl enable ipchange.service  | 
之后启动服务即可:
1  | # 启动服务  | 
如果修改配置文件以后,则需要重新加载配置文件,然后重新启动相关服务:
1  | # 重新加载配置文件  | 
如果程序崩溃可以通过如下命令来查看日志:
1  | # 查看所有日志(默认情况下 ,只保存本次启动的日志)  | 
find
linux下查找文件有两个命令:
- locate:对其生成的数据库进行遍历(生成数据库的命令:updatedb)
- 这一特性决定了用locate查找文件速度很快,但是只能对文件进行模糊匹配,在精确度上来说差了点
 -i:查找文件的时候不区分大小写:locate -i passwd-n:只显示查找结果的前N行:locate -n 5 passwd
 - find
 
使用格式:
1  | find [指定查找目录] [查找规则] [查找完后执行的action]  | 
指定目录
- 
find在不指定查找目录的情况下是对整个系统进行遍历查找
 - 
可以同时查找多个目录,用空格分开即可:
1
find /etc /tmp /root -name passwd
 
查找规则
文件名
-name:根据文件名查找(精确查找)-iname:根据文件名查找,但是不区分大小写
文件名通配符:
*:任意的字符?:任意的单个字符[]:匹配括号里面的任意一个字符
1  | find /etc -name "*passwd*"  | 
所属用户和组
-user:根据属主来查找文件-group:根据属组来查找文件
1  | find /tmp -user root  | 
uid、gid
与上述类似:
1  | find /tmp -uid 500 # 查找uid是500 的文件  | 
与或非
-a:连接两个不同的条件(两个条件必须同时满足)-o:连接两个不同的条件(两个条件满足其一即可)-not:对条件取反
1  | find /tmp -name "*.sh" -a -user root  | 
时间戳
-atime、-amin:最近一次访问时间(atime时间单位为天、amin时间单位为分钟,以下类似)-mtime、-mmin:最近一次内容修改时间-ctime、-cmin:最近一次属性修改时间
1  | stat /etc/passwd # 查看文件的时间信息  | 
文件大小、类型与权限
-size:文件大小查找-perm:文件权限查找-type:文件类型查找,常见类型:- f:普通文件
 - d:目录文件
 - l:链接文件
 - b:块设备文件
 - c:字符设备文件
 - p:管道文件
 - s:socket文件
 
1  | find /tmp -size 2M # 查找在/tmp 目录下等于2M的文件  | 
执行的action
-print:默认情况下的动作-print0:输出的文件列表以null为分隔符,一般配合xargs使用,解决文件名中包含空格的情况-ls:查找到后用 ls 显示出来-ok [commend]:查找后执行指定的命令,并询问用户是否要执行- commend中可以使用
{}代替查找到的文件,下同 - commend最后使用
\;表示分割不同的find内容,下同 
- commend中可以使用
 -exec [commend]:查找后执行指定的命令,不询问用户直接执行
1  | # 查找所有*.sh文件并加上可执行权限  | 
