Linux 常用命令学习
管道符、重定向符、命令行通配符、转义字符与环境变量
管道命令符
管道命令符 |
作用是将前一个命令的标准输出当做后一个命令的标准输入,格式 命令A|命令B
管道命令可以多次使用,如 `命令A|命令B|命令C`
输入输出重定向【命令都是左结合】
标准输入(STDIN,文件描述符为0):默认从键盘输入,为0表示是从其他文件或命令的输出
标准输出(STDOUT,文件描述符为1):默认输出到屏幕,为1时表示是文件
错误输出(STDERR,文件描述符为2):默认输出到屏幕,为2时表示是文件
输出重定向符使用情况
命令 > 文件:将标准输出重定向到一个文件中(清空原有文件的数据)
命令 2> 文件:将错误输出重定向到一个文件中(清空原有文件的数据)
命令 >> 文件:将标准输出重定向到一个文件中(追加到原有内容的后面)
命令 2>> 文件:将错误准输出重定向到一个文件中(追加到原有内容的后面)
命令 >> 文件 2>&1 或 命令 &> 文件:将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)
输入重定向符使用情况
命令 < 文件:将文件作为命令的标准输入
命令 << 分界符:从标准输入中读入,直到遇见“分界符”才停止
命令 < 文件1 > 文件2: 将文件1作为命令的标准输入并将标准输出到文件2(情况文件2中原因的数据【我猜的没有试验过】)
命令行通配符
*:匹配0个或者多个字符
?:匹配给任意单个字符
[0-9]:匹配范围内的数字(可以任意设置,如:[135]表示匹配135这三个数字)
[abc]:匹配已给出的任意字符(和匹配数字一样的)
通配符的用法
- 单独的
*
这里指的是只有 *
出现的情况,默认为单独的一个,*
没有和其它字符联合起来(表示目录的 /
除外)时,这种情况通配的是该目录下的所有非隐藏内容,包括非隐藏的目录和非隐藏的文件。如:
ls *
的时候,相当于 ls 当前目录下的所有内容;ls a*
因为星号表示一个或者多个字符,所以可以找到 a 开头的所有文件;ls *a
但是以 a 结尾的没有,因为有文件的后缀,应该为 ls *a.txt;ls *a*
表示中间段含有 a 的文件;/a/*
匹配所有在 a 路径下的文件, 不包括文件夹/a/*.x
匹配所有在 a 路径下的 .x 文件.*
表示的是该目录下所有的隐藏文件和目录以及 .
,..
。可以尝试执行 ls ~/.*
**
*
匹配 0 或者任意数量的字符**
匹配 0 或者更多的目录
如:
/**/a
匹配/b/a, /c/d/a, 和 /a,即匹配所有 a 文件夹,包括 a 为子文件夹的情况/a/**/b
匹配所有以 a 为上层文件夹,b 为子文件夹的情况/a/**/*
匹配 a 路径下的任何文件和子文件,包括文件夹/**/*.x
匹配任何的.x 文件
转义字符
\(反斜杠):转义后面单个字符
''(单引号):转义所有字符(单引号中所以字符都被转义)
""(双引号):变量依然生效
``(反引号):执行命令语句
PATH 变量
【在 Linux 中一切的都是文件,命令文件也不例外】
用户执行一条命令的过程如下:
1. 如果是以绝对路径或相对路径输入的命令则直接执行(例如执行/bin/ls)
2. 检查是否为 alias 别名命令
3. 由bash判断其是“内部命令”还是“外部命令”【内部命令:属于解释器内部的;外部命令:独立于解释器外的命令文件】
4. 通过$PATH变量定义的;路径进行命令查找
TIPS:$PATH 是“解释器助手”,负责告诉 bash 用户要执行的命令可能存放在哪里
重要的环境变量
变量是由固定的“变量名”与用户或系统设置的“变量值”这两部分组成的
HOME:用户的主目录(即家目录)。 SHELL:用户在使用的 SHELL 解释器名称。 HISTSIZE:历史命令记录条数。 HISTFILESIZE:历史命令记录条数。 MAIL :邮件信箱文件保存路径。 LANG:系统语言、语系名称。 RANDOM:生成一个随机数字。 PS1:bash 解释器的提示符。 PATH:定义解释器搜索用户执行命令的路径。 EDITOR: 用户默认的文本编辑器。
rsync
rsync 的目的是实现本地主机和远程主机上的文件同步(包括本地推到远程,远程拉到本地两种同步方式),也可以实现本地不同路径下文件的同步,但不能实现远程路径 1 到远程路径 2 之间的同步(scp 可以实现)。
rsync 具有如下的基本特性:
- 可以镜像保存整个目录树和文件系统
- 可以很容易做到保持原来文件的权限、时间、软硬链接等
- 无须特殊权限即可安装
- 优化的流程,文件传输效率高
- 可以使用 rsh、ssh 方式来传输文件,当然也可以通过直接的 socket 连接
- 支持匿名传输,以方便进行网站镜象
无论本地同步目录还是远程同步数据,首次运行时将会把全部文件拷贝一次,以后再运行时将只拷贝有变化的文件(对于新文件)或文件的变化部分(对于原有文件)。
本节重点介绍 rsync 客户命令的使用,有关 rsync 服务器的配置和使用请参见下节。
rsync 在首次复制时没有速度优势,速度不如 tar,因此当数据量很大时您可以考虑先使用 tar 进行首次复制,然后再使用 rsync 进行数据同步。
rsync 用法
rsync 是一个功能非常强大的工具,其命令也有很多功能选项。
# 在本地同步, 同步目录需加 -r
rsync -r docker/a/ docker/b/
# 将本地 docker/a/ 目录拷贝到远程主机的 alvinhtml/ 下,以保证远程目录和本地 docker/a/ 保持同步
rsync -r -e 'ssh -p 29771' docker/a/ root@65.49.195.225:/home/wwwroot/alvinhtml/
# 将远程主机的 docker/a/ 目录拷贝到本地 alvinhtml/ 下,以保证本地目录和远程 docker/a/ 保持同步
rsync -r -e 'ssh -p 29771' root@65.49.195.225:/home/wwwroot/alvinhtml/ docker/a/
# 列出本地 docker/a/ 目录下的文件列表
rsync docker/a/
# 列出远程主机上 /home/wwwroot/alvinhtml/ 目录下的文件列表
rsync -e 'ssh -p 29771' root@65.49.195.225:/home/wwwroot/alvinhtml/
# 将 a 目录同步到 b, 排除所有层级下的 ax 目录,
rsync -av --exclude "ax" ./a ./b
rsync 使用 --exclude "ax"
后的同步结果:
.
├── a
│ ├── a1
│ │ └── b
│ │ └── ax
│ │ └── 1.txt
│ └── ax
│ └── 2.txt
├── b
│ └── a
│ └── a1
│ └── b
└──
假如源目录写为 /var/www/
就会把该目录下所有文件同步到目标目录,如果写为 /var/www/*
,那么当前目录下的隐藏文件(文件夹名或文件名是以”.”号开头)则不会被同步,不过子目录中的隐藏文件还是会被同步。
假设需要排除某个文件(或文件夹),可以用–exclude 来指定,例如需要排除源目录下的 dir1 文件夹,可以写为:
/usr/bin/rsync -vzrtopg –exclude=dir1 /var/www/src/ /var/www/dest
可以同时排除多条,例如:
/usr/bin/rsync -vzrtopg –exclude=dir1 –exclude=dir2 /var/www/src/ /var/www/dest
除了上述方法,还可以通过–exclude-from 来指定,例如:
/usr/bin/rsync -vzrtopg –exclude-from=exclude.list /var/www/src/ /var/www/dest
exclude.list 文件中指定需要排除的列表,例如:
dir1
[0-9]*
dir2/.[a-z0-9]*
.svn
yum
使用 yum
安装和更新软件包
# 列出所有可更新的软件清单
yum check-update
# 安装所有更新软件
yum update
# 仅安装指定的软件
yum install <package_name>
# 仅更新指定的软件
yum update <package_name>
# 用YUM删除软件包
yum remove <package_name>
which
which 命令的原理:在 PATH 变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。
which npm
# 查看当前安装的版本及位置
ls -l `which node`
env
显示当前环境变量
iproute2
iproute2 是 linux 下管理控制 TCP/IP 网络和流量控制的新一代工具包,旨在替代老派的工具链 net-tools,即大家比较熟悉的 ifconfig,arp,route,netstat 等命令。net-tools 通过 procfs(/proc)和 ioctl 系统调用去访问和改变内核网络配置,而 iproute2 则通过 netlink 套接字接口与内核通讯。
ip 地址管理
1.显示 ip 地址
ip a
ip address show
ip addr show dev eth0
ip a sh eth0
2.增加删除地址
ip address add 192.0.2.1/24 dev eth0
ip addr del 192.0.2.2/24 dev eth0
3.显示接口统计
ip -s link ls eth0
网卡和链路配置
4.显示链路
ip link show
ip link sh eth0
5.修改接口状态
ip link set eth0 up
ip link s gre01 down
路由表管理
6.显示路由表
ip route
ip ro show dev gre01
7.增加新路由
ip route add 10.2.2.128/27 dev gre01
8.增加默认路由
ip route add default via 192.168.1.1
9.修改默认路由
ip route chg default via 192.168.1.2
10.删除默认路由
ip route del default
sysctl 内核与模块管理
sysctl 命令被用于在内核运行时动态地修改内核的运行参数
sysctl(选项)(参数)
选项:
-n:打印值时不打印关键字;
-e:忽略未知关键字错误;
-N:仅打印名称;
-w:当改变sysctl设置时使用此项;
-p:从配置文件“/etc/sysctl.conf”加载内核参数设置;
-a:打印当前所有可用的内核参数变量和值;
-A:以表格方式打印当前所有可用的内核参数变量和值。
参数:
变量=值:设置内核参数对应的变量值。
telnet
telnet [-8acdEfFKLrx][-b<主机别名>][-e<脱离字符>][-k<域名>][-l<用户名称>][-n<记录文件>][-S<服务类型>][-X<认证形态>][主机名称或IP地址<通信端口>]
-8 允许使用8位字符资料,包括输入与输出。
-a 尝试自动登入远端系统。
-b<主机别名> 使用别名指定远端主机名称。
-c 不读取用户专属目录里的.telnetrc文件。
-d 启动排错模式。
-e<脱离字符> 设置脱离字符。
-E 滤除脱离字符。
-f 此参数的效果和指定"-F"参数相同。
-F 使用Kerberos V5认证时,加上此参数可把本地主机的认证数据上传到远端主机。
-k<域名> 使用Kerberos认证时,加上此参数让远端主机采用指定的领域名,而非该主机的域名。
-K 不自动登入远端主机。
-l<用户名称> 指定要登入远端主机的用户名称。
-L 允许输出8位字符资料。
-n<记录文件> 指定文件记录相关信息。
-r 使用类似rlogin指令的用户界面。
-S<服务类型> 设置telnet连线所需的IP TOS信息。
-x 假设主机有支持数据加密的功能,就使用它。
-X<认证形态> 关闭指定的认证形态。
telnet 65.49.195.225 8358
nc
nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>][-s<来源位址>][-v...][-w<超时秒数>][主机名称][通信端口...]
nc -v -w2 65.49.195.225 8350-8359
md5
md5 ./filename.txt
grep
grep [选项] 搜索内容 文件名
选项说明
-A n:n为数字,列出符合条件的行,并列出后续的n行。
-B n:n为数字,列出符合条件的行,并列出前面的n行。
-c:统计找到的符合条件的字符串的次数。
-i:忽略大小写。
-n:输出行号。
-v:反向査找,也就是查询没有关键字的一行。
--color=auto:搜索出的关键字用颜色显示。
ls
# 查看文件夹大小
ls -lh
du
# 查看文件夹大小
du -h -d 1
lsof
查看端口被哪个进程占用
lsof -i:8081
echo
将 123
追加到 a.txt
echo '123' >> a.txt
# or
cat circleci-rsa.pub >> authorized_keys
cat
合并多个文件到一个文件
cat b1.sql b2.sql b3.sql > b_all.sql
# 或者
cat *.sql > merge.sql
ln
ln [参数][源文件或目录][目标文件或目录]
ln -s /a/err.log /b/err.log
Linux 查看内存使用情况
- top: 用于实时显示 process 的动态
- free: 查看系统内存使用情况
- cat /proc/meminfo: 查看 RAM 使用情况最简单的方法是通过 /proc/meminfo
这个动态更新的虚拟文件实际上是许多其他内存相关工具(如:free / ps / top)等的组合显示。
/proc/meminfo
列出了所有你想了解的内存的使用情况。
进程的内存使用信息也可以通过 /proc/<pid>/statm
和 /proc/<pid>/status
来查看。
tree
tree -a #显示所有
tree -d #仅显示目录
tree -L n #n代表数字..表示要显示几层
tree -f #显示完整路径
tree -P .DS_Store/ -a # / 表示不显示
- -a 显示所有文件和目录。
- -A 使用 ASNI 绘图字符显示树状图而非以 ASCII 字符组合。
- -C 在文件和目录清单加上色彩,便于区分各种类型。
- -d 显示目录名称而非内容。
- -D 列出文件或目录的更改时间。
- -f 在每个文件或目录之前,显示完整的相对路径名称。
- -F 在执行文件,目录,Socket,符号连接,管道名称名称,各自加上"*","/","=","@","|"号。
- -g 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码。
- -i 不以阶梯状列出文件或目录名称。
- -L level 限制目录显示层级。
- -l 如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录。
- -n 不在文件和目录清单加上色彩。
- -N 直接列出文件和目录名称,包括控制字符。
- -p 列出权限标示。
- -P<范本样式> 只显示符合范本样式的文件或目录名称。
- -q 用"?"号取代控制字符,列出文件和目录名称。
- -s 列出文件或目录大小。
- -t 用文件和目录的更改时间排序。
- -u 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码。
- -x 将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该子目录予以排除在寻找范围外。
compgen
查看可用命令列表
compgen -c
poweroff
强制关机
history
history
# 执行一条历史命令
!112
fdisk
# 显示磁盘分区
fdisk -l
tail
tail [参数] [文件]
参数:
-f 循环读取
-q 不显示处理信息
-v 显示详细的处理信息
-c<数目> 显示的字节数
-n<行数> 显示文件的尾部 n 行内容
--pid=PID 与-f合用,表示在进程ID,PID死掉之后结束
-q, --quiet, --silent 从不输出给出文件名的首部
-s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒
tail -100 | grep error
cat /etc/shells
# 查看系统有几个shell
cat /etc/shells
# 使用下面命令设置默认shell
chsh -s /bin/zsh
echo $?
输出上一次命令的 code
自定义 shell
stat
Linux stat 命令用于显示 inode 内容。
语法:
stat [文件或目录]