[Linux] Bash基础命令使用

POSIX:可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX),发布者为电气与电子工程师协会(Institute of Electrical and Electronics Engineers),简称IEEE。

POSIX是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945

基础命令

Ctrl + r,进入历史命令的搜索功能模式
history,查看所有的历史命令

tty,查看当前终端
输入 echo $$ 可以查看当前终端的进程pid

&表示这个程序在后台运行

./hello &

nohup command & 之后ctrl+d 或者 关闭窗口 进程仍然会在后台执行

./表示当前目录 如果不写./,Linux 会到系统路径下查找文件
所谓系统路径,就是环境变量指定的路径,我们可以通过修改环境变量添加自己的路径,或者删除某个路径。
很多时候,一条 Linux 命令对应一个可执行程序,如果执行命令时没有指明路径,那么就会到系统路径下查找对应的程序。

| 管道 (pipeline) 连结上个指令的标准输出,做为下个指令的标准输入。
通过 &&|| 可以控制多条命令的执行情况
&&要求前一条命令执行成功才执行后面的语句 ||则是前一条失败才执行后面语句

查询CPU信息: cat /proc/cpuinfo
查看CPU的核的个数: cat /proc/cpuinfo | grep processor | wc -l
查看内存信息: cat /proc/meminfo
显示内存page大小(以KByte为单位): pagesize

ifconfig,查看内网 IP 等信息(常用)

date,查看系统时间(常用)

  • date -s20080103,设置日期(常用)
  • date -s18:24,设置时间

bashrc与profile都用于保存用户的环境信息,bashrc用于交互式non-loginshell,而profile用于交互式login shell。

/etc/profile/etc/bashrc 是系统全局环境变量设定
~/.profile~/.bashrc用户目录下的私有环境变量设定

unset $JAVA_HOME,删除指定的环境变量

~/.profile~/.bashrc的区别:

  • 这两者都具有个性化定制功能
  • ~/.profile可以设定本用户专有的路径,环境变量,等,它只能登入的时候执行一次
  • ~/.bashrc也是某用户专有设定文档,可以设定路径,命令别名,每次shell script的执行都会使用它一次

我们可以在这些环境变量中设置自己经常进入的文件路径,以及命令的快捷方式
通过修改.bashrc 可以为命令设置别名 (该文件就在主文件夹底下 隐藏显式)

alias lsl='ls -lrt' 
alias lm='ls -al | more'

启动帐号后自动执行的是 文件为.profile,然后通过这个文件可设置自己的环境变量
安装的软件路径一般需要加入到path中:

使用ls -l可查看文件的属性字段 文件属性字段总共有10个字母组成
第一个字母表示文件类型,如果这个字母是一个减号-, 则说明该文件是一个普通文件。字母d表示该文件是一个目录,字母d,是dirtectory(目录)的缩写。
后面的9个字母为该文件的权限标识,3个为一组,分别表示文件所属用户、用户所在组、其它用户的读写和执行权限;

-rwxrw-r-- colin king 725 2023-11-12 15:37 /home/colin/a 

表示这个文件对文件拥有者colin这个用户可读写、可执行;对colin所在的组(king)可读可写;对其它用户只可读

帮助命令

命令 作用
whatis command 简要说明command的作用(显示command所处的man分类页面)
man command 查询命令command的说明文档
which command 查看程序的binary文件所在路径
whereis command 查看程序的搜索路径(用于当系统中安装了同一软件的多个版本时,不确定使用的是哪个版本时)

文件/目录管理

创建:mkdir
touch 文件名,创建一个空白文件

删除:rm
删除非空目录:rm -rf file/dirtectory
删除日志 rm *log (等价: $find ./ -name “*log” -exec rm {} ;)

移动:mv

重命名: mv/rename

复制:cp (复制目录:cp -r )

切换到上一个工作目录:cd -或者cd ..
切换到home目录: cd or cd ~

显示当前路径: pwd
显示当前目录下的文件: ls, ls -a 可以显式隐藏文件

按时间排序,以列表的方式显示目录项 ls -lrt

查看两个文件间的差别: diff file1 file2

在文件内查找指定的字符串: egrep 执行效果与grep-E相似

egrep Linux * # 查找当前目录下包含字符串“Linux”的文件

改变文件的拥有者: chown

使用chmod命令可以更改文件的读写权限,更改读写权限有两种方法,一种是字母方式,一种是数字方式

  • 字母方式: chmod [-R] userMark(+|-) PermissionsMark

    • -R代表递归
    • +|- 代表增加或删除权限
  • userMark取值:

    • u:用户
    • g:组
    • o:其它用户
    • a:所有用户
  • PermissionsMark取值:

    • r: 读
    • w:写
    • x:执行
chmod a+x main # 对所有用户给文件main增加可执行权限
chmod g+w blogs # 对组用户给文件blogs增加可写权限
  • 数字方式:
    • 数字方式直接设置所有权限,相比字母方式,更加简洁方便;
    • 使用三位八进制数字的形式来表示权限,第一位指定属主的权限,第二位指定组权限,第三位指定其他用户的权限,每位通过4(读)、2(写)、1(执行)三种数值的和来确定权限。如6(4+2)代表有读写权,7(4+2+1)有读、写和执行的权限。
chmod 740 main # 将main的用户权限设置为rwxr-----

更改文件或目录的拥有者:

chown username dirOrFile #使用-R选项递归更改该目下所有文件的拥有者

创建符号链接/硬链接:
ln 加上命令-s为软链接
软连接等价于起别名 硬链接等价于复制一个新文件

cat(英文全拼:concatenate)命令用于连接文件并打印到标准输出设备上。

  • -n--number:由 1 开始对所有输出的行数编号。
  • -b--number-nonblank:和 -n 相似,只不过对于空白行不编号

> 可以进行输出重定向 cat默认输出到标准输出流
cat结合:

cat -n textfile1 > textfile2 # 把 textfile1 的文档内容加上行号后输入 textfile2 这个文档里

file命令用于辨识文件类型。

file [-bcLvz][-f <名称文件>][-m <魔法数字文件>...][文件或目录...]
  • -b 列出辨识结果时,不显示文件名称。
  • -c 详细显示指令执行过程,便于排错或分析程序执行的情形。
  • -f<名称文件> 指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称。
  • -L 直接显示符号连接所指向的文件的类别。
  • -m<魔法数字文件> 指定魔法数字文件。
  • -v 显示版本信息。
  • -z 尝试去解读压缩文件的内容。
    [文件或目录...]为 要确定类型的文件列表,多个文件之间使用空格分开,可以使用shell通配符匹配多个文件。

ar命令用于建立或修改备存文件,或是从备存文件中抽取文件。ar可让您集合许多文件,成为单一的备存文件。在备存文件中,所有成员文件皆保有原来的属性与权限。

  • d 删除备存文件中的成员文件。
  • m 变更成员文件在备存文件中的次序。
  • p 显示备存文件中的成员文件内容。
  • q 将文件附加在备存文件末端。
  • r 将文件插入备存文件中。
  • t 显示备存文件中所包含的文件。
  • x 自备存文件中取出成员文件。
  • a<成员文件> 将文件插入备存文件中指定的成员文件之后。
  • b<成员文件> 将文件插入备存文件中指定的成员文件之前。
  • c 建立备存文件。
  • i<成员文件> 将文件插入备存文件中指定的成员文件之前。
  • o 保留备存文件中文件的日期。
  • s 若备存文件中包含了对象模式,可利用此参数建立备存文件的符号表。
  • S 不产生符号表。
  • v 程序执行时显示详细的信息。
ar rv one.bak a.c b.c # 打包 a.c b.c文件

文本处理

文件查找: find
Eg. 查找txt和pdf文件:

find . \( -name "*.txt" -o -name "*.pdf" \) -print
  • 按类型搜索 -f 文件 / -l 符号链接 / -d 目录

  • 按时间搜索
    -atime 访问时间 (单位是天,分钟单位则是-amin,以下类似)
    -mtime 修改时间 (内容被修改)
    -ctime 变化时间 (元数据或权限变化)

  • 按大小搜索 -size

  • 找到后的操作:

    • 删除 -delete
    • 打印 -print
    • 执行动作 -exec+命令

文本搜索: grep

  • -o 只输出匹配的文本行 VS -v 只输出没有匹配的文本行
  • -c 统计文件中包含文本的次数
  • -n 打印匹配的行号
  • -i 搜索时忽略大小写
  • -l 只打印文件名

xargs 能够将输入数据转化为特定命令的命令行参数;是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要。

  • -d 定义定界符 (默认为空格 多行的定界符为 n)
  • -n 指定输出为多行
  • -I {} 指定替换字符串,这个字符串在xargs扩展时会被替换掉,用于待执行的命令需要多个参数时
  • -0:指定0为输入定界符
find . type f -name "*.swp" | xargs rm

对文件内容进行排序: sort

  • -n 按数字进行排序
  • -d 按字典序进行排序
  • -r 逆序排序
  • -k N 指定按第N列排序

uniq命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。

  • -c--count 在每列旁边显示该行重复出现的次数。
  • -d--repeated 仅显示重复出现的行列。
  • -u--unique 仅显示出一次的行列。
  • -w<字符位置>--check-chars=<字符位置> 指定要比较的字符。

tr 命令用于转换或删除文件中的字符。tr 指令从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备

tr [OPTION] SET1 [SET2] 
  • -d, --delete:删除指令字符
  • -c, --complement:反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换
  • -s, --squeeze-repeats:缩减连续重复的字符成指定的单个字符 常用于压缩多余的空格
    cat file | tr -s ' '
    

cut命令用于显示每行从开头算起 num1num2 的文字。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。

  • -c :以字符为单位进行分割。
  • -d :自定义分隔符,默认为制表符。
  • -f :与-d一起使用,指定显示哪个区域。

wc 统计行和字符的工具

  • -l 统计行数
  • -w 统计单词数
  • -c 统计字符数

磁盘管理

查看磁盘空间利用大小: df -h

  • -h: human缩写,以易读的方式显示结果(即带单位:比如M/G,如果不加这个参数,显示的数字以B为单位)

查看目录所占空间大小:du -sh

  • -s 递归整个目录的大小
  • -h 人性化显示

打/解包: tar

tar -cvf etc.tar /etc # 仅打包,不压缩! 压缩用zip
tar -xvf demo.tar
  • -x 表示进行解包
  • -c :表示进行打包, 即将所有文件放到一个文件夹中
  • -v :显示打包进度
  • -f :使用档案文件
  • -z 解压gz文件
  • -j 解压bz2文件
  • -J 解压xz文件

进程管理

任何进程都与文件关联;我们会用到lsof工具(list opened files),作用是列举系统中已经被打开的文件。在linux环境中,任何事物都是文件,设备是文件,目录是文件,甚至sockets也是文件。用好lsof命令,对日常的linux管理非常有帮助。

查看端口占用的进程状态:lsof 直接加文件名
lsof abc.txt:显示开启文件abc.txt的进程

  • -i:查看端口占用 #lsof -i:8080 查看8080端口占用
  • -c: 显示该进程现在打开的文件 # -c -p 1234 列出进程号为1234的进程所打开的文件
  • -u username: 查看用户username的进程所打开的文件
  • +d: 查询指定目录下被进程开启的文件(使用+D 递归c目录)

查询正在运行的进程信息: ps

  • -A/-e 列出所有的进程
  • -w 显示加宽可以显示较多的资讯
  • a:显示终端上的所有进程,包括其他用户的进程
  • u:显示进程的详细信息
  • x:显示没有控制终端的进程
  • j:列出与作业控制相关的信息
ps -ef | grep 进程关键字 # 查找指定进程:
ps auxw --sort=-%cpu # 查看CPU使用率最高的进程

-%cpu 代表降序 若为--sort=%cpu 表示升序

输入参数j时可以查看到与作业控制相关的信息

  • ppid 父进程id
  • pid 进程id
  • pgid 进程组id

显示进程信息,并实时更新: top
top界面输入字符命令后显示相应的进程状态

  • P:根据CPU使用百分比大小进行排序。
  • M:根据驻留内存大小进行排序。
  • i:使top不显示任何闲置或者僵死进程。
  • m:显示或隐藏内存状态信息
  • s:设置刷新时间间隔
  • <Space>:立即刷新
  • q:退出top命令
  • T:按MITE+排行
  • K: kill进程

结束进程: kill
直接kill pid可以杀死进程 加-9是彻底杀死

kill 本质上是将指定的信息送至程序。预设的信息为 SIGTERM(15),可将指定程序终止。
若仍无法终止该程序,可使用 SIGKILL(9) 信息尝试强制删除程序。

程序或工作的编号可利用 ps 指令或 jobs 指令查看。

  • -1 (HUP):重新加载进程。
  • -9 (KILL):杀死一个进程。
  • -15 (TERM):正常停止一个进程。
  • -l <信息编号> 若不加<信息编号>选项,则 -l 参数会列出全部的信息名称。
  • -s <信息名称或编号> 指定要送出的信息。 ps -s 9 pid

性能监控

查看CPU使用率: sar -u n mn 为监控频率、m为监控次数)
查看内存使用状况: sar -r n m
当系统中sar不可用时,可以使用以下工具替代: vmstat

网络工具

ifconfig查看ip

netstat 命令用于显示网络状态。利用 netstat 指令可让你得知整个 Linux 系统的网络情况。

  • -a--all 显示所有连线中的Socket。
  • -c--continuous 持续列出网络状态。
  • -e--extend 显示网络其他相关信息。
  • -p--programs 显示正在使用Socket的程序识别码和程序名称。
  • -r--route 显示Routing Table。
  • -t--tcp 显示TCP传输协议的连线状况。
  • -u--udp 显示UDP传输协议的连线状况。
  • -l--listening 显示监控中的服务器的Socket。
  • -n--numeric 直接使用IP地址,而不通过域名服务器。

列出所有 tcp 端口: netstat -at
使用netstat工具查询端口: netstat -antp | grep 6379

查看路由状态: route -n

探测前往地址IP的路由路径: traceroute IP

DNS查询,寻找域名domain对应的IP: host domain

ssh登陆远程服务器host,ID为用户名: ssh ID@host

ftp/sftp文件传输: sftp ID@host
ftp登陆后,可以使用下面的命令进一步操作:

  • get filename # 下载文件
  • put filename # 上传文件
  • ls # 列出host上当前路径的所有文件
  • cd # 在host上更改当前路径
  • lls # 列出本地主机上当前路径的所有文件
  • lcd # 在本地主机更改当前路径

网络复制:
将本地localpath指向的文件上传到远程主机的path路径: scp localpath ID@host:path
以ssh协议,遍历下载path路径下的整个文件系统,到本地的localpath: scp -r ID@site:path localpath

用户管理

添加用户: useradd -m username

为用户添加/修改密码: passwd username

删除用户: userdel -r username #不带选项使用 userdel,只会删除用户。用户的home目录将仍会在/home目录下。要完全的删除用户信息,使用-r选项

切换到用户B: su userB

查看用户当前组: groups

变更用户组:

usermod -G groupNmame username 
# 一个用户可以属于多个组 -G是将用户加入到组, -g将用户加入到新的组,并从原有的组中除去