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]:匹配已给出的任意字符(和匹配数字一样的)

通配符的用法

  1. 单独的 *

这里指的是只有 * 出现的情况,默认为单独的一个,* 没有和其它字符联合起来(表示目录的 / 除外)时,这种情况通配的是该目录下的所有非隐藏内容,包括非隐藏的目录和非隐藏的文件。如:

  • ls * 的时候,相当于 ls 当前目录下的所有内容;
  • ls a* 因为星号表示一个或者多个字符,所以可以找到 a 开头的所有文件;
  • ls *a 但是以 a 结尾的没有,因为有文件的后缀,应该为 ls *a.txt;
  • ls *a* 表示中间段含有 a 的文件;
  • /a/* 匹配所有在 a 路径下的文件, 不包括文件夹
  • /a/*.x 匹配所有在 a 路径下的 .x 文件

  • .*

表示的是该目录下所有的隐藏文件和目录以及 ...。可以尝试执行 ls ~/.*

  1. **

  2. * 匹配 0 或者任意数量的字符

  3. ** 匹配 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:搜索出的关键字用颜色显示。

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 [文件或目录]

nohup ./trojan-go -config config.json &

results matching ""

    No results matching ""