linux常用命令、bash语法学习笔记,持续记录

2023-02-17 14:03:12 浏览数 (1)

命令相关

linux命令存储以下位置:

  • /bin(指向/usr/bin)目录,包含基本的用户命令,默认全体用户都可使用,例如curl,ls命令
  • /sbin(指向/usr/sbin),/usr/local/sbin,存放需要root权限的命令以及工具,默认root用户使用,例如ip,halt命令
  • /usr/local/bin 给用户放置自己的可执行程序的地方,不会被系统升级覆盖
  • /usr/local/sbin 给管理员放置自己的可执行程序的地方,不会被系统升级覆盖

如果在每个命令目录都存在某个命令时,通过系统的$PATH变量决定优先级

代码语言:javascript复制
echo $PATH 
# 每台电脑输出不同,/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/protobuf/bin/:/root/bin

所以,当输入 ls 命令,点击回车时,系统会以此从各个目录找到这个命令文件,然后执行该文件.

如果你的程序命令没有放在以上文件夹,我们也可通过相对路径以及绝对路径启动该命令:

代码语言:javascript复制
./php -m #当你在php命令文件目录中时,
/www/server/php/72/bin/php -m,宝塔php命令目录

根据这个原理,我们可以安装多个php版本,并启动

代码语言:javascript复制
/www/server/php/72/bin/php -m
/www/server/php/56/bin/php -m

基本语法

1. “;”分号用法

方式:command1 ; command2

用;号隔开每个命令, 每个命令按照从左到右的顺序,顺序执行, 彼此之间不关心是否失败, 所有命令都会执行。

2. “| ”管道符用法

上一条命令的输出,作为下一条命令参数

方式:command1 | command2

Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推

利用一个管道# rpm -qa|grep licq

这条命令使用一个管道符“|”建立了一个管道。管道将rpm -qa命令的输出(包括系统中所有安装的RPM包)作为grep命令的输入,从而列出带有licq字符的RPM包来。

3. “||”符号用法

逻辑或的功能

语法格式如下:

command1 || command2 [|| command3 ...]

命令之间使用 || 连接,实现逻辑或的功能。

只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。

4. “&”符号用法

&放在启动参数后面表示设置此进程为后台进程

方式:command1 &

默认情况下,进程是前台进程,这时就把Shell给占据了,我们无法进行其他操作,对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个'&'实现这个目的。

5. “&&”符号用法

shell 在执行某个命令的时候,会返回一个返回值,该返回值保存在 shell 变量 ? 中。当 ? == 0 时,表示执行成功;当

有时候,下一条命令依赖前一条命令是否执行成功。如:在成功地执行一条命令之后再执行另一条命令,或者在一条命令执行失败后再执行另一条命令等。shell 提供了 && 和 || 来实现命令执行控制的功能,shell 将根据 && 或 || 前面命令的返回值来控制其后面命令的执行。

语法格式如下:

command1 && command2 [&& command3 ...]

命令之间使用 && 连接,实现逻辑与的功能。

只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。

只要有一个命令返回假(命令返回值 $? == 1),后面的命令就不会被执行。

6. linux > 和 >> 、< 区别

linux中经常会用到将内容输出到某文件当中,只需要在执行命令后面加上>或者>>号即可进入操作。

大于号:将一条命令执行结果(标准输出,或者错误输出,本来都要打印到屏幕上面的)重定向其它输出设备(文件,打开文件操作符,或打印机等等)

小于号:命令默认从键盘获得的输入,改成从文件,或者其它打开文件以及设备输入

>> 是追加内容

>   是覆盖原有内容

参考:https://www.cnblogs.com/fnlingnzb-learner/p/6839669.html

网络工具

它不依赖内核中的模块。当我们的服务器网络异常时,可以通过运行nethogs程序来检测是那个程序占用了大量带宽。节省了查找时间。

代码语言:javascript复制
yum install nethogs
nethogs
sysstat
iostat -x 1 10

测压工具

1. 安装

如果不想安装apache但是又想使用ab命令,可以直接安装apache的工具包httpd-tools。

代码语言:javascript复制
#安装
yum -y install httpd-tools 
#使用
ab [options] [http[s]://]hostname[:port]/path 

2. 命令参数

代码语言:javascript复制
-A auth-username:password
对服务器提供BASIC认证信任。 用户名和密码由一个:隔开,并以base64编码形式发送。 无论服务器是否需要(即, 是否发送了401认证需求代码),此字符串都会被发送。

-c concurrency
一次产生的请求个数。默认是一次一个。

-C cookie-name=value
对请求附加一个Cookie:行。 其典型形式是name=value的一个参数对。 此参数可以重复。

-d 显示”percentage served within XX [ms] table”的消息(为以前的版本提供支持)。

-e csv-file
产生一个以逗号分隔的(CSV)文件, 其中包含了处理每个相应百分比的请求所需要(从1%到100%)的相应百分比的(以微妙为单位)时间。 由于这种格式已经“二进制化”,所以比’gnuplot’格式更有用。

-g gnuplot-file
把所有测试结果写入一个’gnuplot’或者TSV (以Tab分隔的)文件。 此文件可以方便地导入到Gnuplot, IDL, Mathematica, Igor甚至Excel中。 其中的第一行为标题。

-h 显示使用方法。

-H custom-header
对请求附加额外的头信息。 此参数的典型形式是一个有效的头信息行,其中包含了以冒号分隔的字段和值的对 (如, “Accept-Encoding: zip/zop;8bit”).

-i 执行HEAD请求,而不是GET。

-k 启用HTTP KeepAlive功能,即, 在一个HTTP会话中执行多个请求。 默认时,不启用KeepAlive功能.

-n requests
在测试会话中所执行的请求个数。 默认时,仅执行一个请求,但通常其结果不具有代表意义。

-p POST-file
包含了需要POST的数据的文件.

-P proxy-auth-username:password
对一个中转代理提供BASIC认证信任。 用户名和密码由一个:隔开,并以base64编码形式发送。 无论服务器是否需要(即, 是否发送了401认证需求代码),此字符串都会被发送。

-q 如果处理的请求数大于150, ab每处理大约10%或者100个请求时,会在stderr输出一个进度计数。 此-q标记可以抑制这些信息。

-s 用于编译中(ab -h会显示相关信息)使用了SSL的受保护的https, 而不是http协议的时候。此功能是实验性的,也是很简陋的。最好不要用。

-S 不显示中值和标准背离值, 而且在均值和中值为标准背离值的1到2倍时,也不显示警告或出错信息。 默认时,会显示 最小值/均值/最大值等数值。(为以前的版本提供支持).

-t timelimit
测试所进行的最大秒数。其内部隐含值是-n 50000。 它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。

-T content-type
POST数据所使用的Content-type头信息。

-v verbosity
设置显示信息的详细程度 - 4或更大值会显示头信息, 3或更大值可以显示响应代码(404, 200等), 2或更大值可以显示警告和其他信息。

-V 显示版本号并退出。

-w 以HTML表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。

-x <table>-attributes
设置<table>属性的字符串。 此属性被填入<table 这里 >.

-X proxy[:port]
对请求使用代理服务器。

-y <tr>-attributes
设置<tr>属性的字符串.

-z <td>-attributes
设置<td>属性的字符串.

对json.im进行,1000次请求,并发用户10的压力测试

代码语言:javascript复制
ab -n 1000 -c 10 https://json.im
  • -n 1000表示请求总数为1000
  • -c 10表示并发用户数为10

3. 登录问题

对于实际场景中经常需要用的登录问题,如果接口需要验证Cookie ,那么使用-C写到Cookie内容

代码语言:javascript复制
$ ab -n 100 -C key=value https://json.im
# 或者使用 -H 带 Cookie 自定义多个字段

$ ab -n 100 -H "Cookie: Key1=Value1; Key2=Value2" http://localhost
# 测试接口Header传入token

$ ab -n 1000 -c 10 -H 'token:abc' https://json.im 

常用命令

1. ls命令

ls命令查看当前目录中的文件信息,格式:ls [选项] [文件]

代码语言:javascript复制
ls -a 查看所有文件列表(可查看隐藏文件)
ls -l 以列表方式显示文件的详细信息
ls -h 配合-l以人性化的方式显示文件大小
ls -l -h 显示文件大小更加直观
ls -lh
ls -hl
ls -lha

ls通配符的使用

  • * 代表任意数个字符
  • ? 代表任意一个字符,至少1个
  • [] 表示可以匹配字符组中的任一一个
  • [abc] 匹配a、b、c中的任意一个
  • [a-f] 匹配从a到f范围内的任意一个
代码语言:javascript复制
ls 1*
ls *1.txt
ls *3*
ls 1?1.txt
ls [123]23.txt
ls [1-3]23.txt

2. cd命令

cd命令用于切换工作路径,格式:cd [目录名]

linux下文件和目录特点:

  • . 代表当前目录
  • .. 代表上一级目录
代码语言:javascript复制
cd 切换目录
cd ~ 切换到当前用户的主目录(家目录~)
cd . 保持在当前目录不变
cd .. 切换到上级目录
cd - 可以在最近两次工作目录之间来回切换

3. touch 命令

touch命令用于创建空白文件或设置文件的时间,格式: touch [选项 ] [文件]。

参数:

  • -a 仅修改“读取时间”(atime)
  • -m 仅修改“修改时间”(mtime)
  • -d 同时修改 atime和mtime

touch 文件名 如果文件不存在,可以创建一个空白文件;如果文件已存在,可以修改文件的末次修改日期

4. mkdir命令

mkdir命令用于创建空白的目录,格式:mkdir [选项] 目录。

参数:

  • -p 可以递归递归创建出具有嵌套叠层关系的文件目录
  • mkdir 文件夹名 创建一个新的目录
  • mkdir -p a/b/c/d 递归创建多个目录

5. pwd命令

pwd命令用于查看当前所在文件夹目录

6. clear 命令

clear命令用于清屏

7. rm命令

rm命令用于删除文件或目录,格式:rm [选项 ] 文件。

代码语言:javascript复制
rm 删除文件或目录
rm -f 强制删除,忽略不存在的文件,无需提示
rm -r 递归地删除目录下的内容,删除文件夹时必须加此参数
rm *1.txt 删除以1.txt结尾的所有文件
rm -r *
rm -rf * 强制删除该文件夹中所有文件 (删除完成不可恢复)

8. cp命令

cp命令用于复制文件或目录,格式:cp [选项 ] 源文件 目标文件。

代码语言:javascript复制
cp -f -r * /home/wwwroot/default
  • 如果目标文件是目录,则会把源文件复制到该目录中;
  • 如果目标文件也是普通文件,则会询问是否要覆盖它;
  • 如果目标文件不存在,则执行正常的复制操作。
代码语言:javascript复制
cp 源文件 目标文件 复制文件或目录
cp -i 源文件名 目录名 覆盖文件前提示
cp -r 源文件名 目录名 若给出的源文件是目录文件,则cp将递归复制该目录下的所有子目录和文件,目标文件必须为一个目录名
cp -d 源文件 目标文件 若对象为“链接文件”,则保留该“链接文件”的属性
cp -p 源文件 目标文件 保留原始文件的属性
cp -a 源文件 目标文件 相当于-pdr

9. mv命令

mv命令用于移动文件或将文件重命名,格式: mv [选项 ] 源文件 [目标路径 |目标文件名 ]。

代码语言:javascript复制
mv 源文件 目标文件 移动文件或目录 / 重命名文件或目录
mv 文件名 目标文件目录
mv -i 文件名 目标文件目录 覆盖文件前提示
-b	若需覆盖文件,则覆盖前先行备份。
-f	若目标文件或目录与现有的文件或目录重复,则直接覆盖现有的文 件或目录。
-i	覆盖前先行询问用户。
-u	在移动或更改文件名时,若目标文件已存在,且其文件日期比源文件新,则不覆盖目标文件。
-v	执行时显示详细的信息。

10. tree命令

tree [目录名] 以树状图列出文件目录结构,tree -d 只显示目录信息

11. cat命令

cat命令用于查看内容较少的纯文本文件,格式:cat [选项] [文件]。

代码语言:javascript复制
cat 文件名 查看文件内容、创建文件、文件合并、追加文件内容等功能,会一次性显示所有的内容,适合查看内容较少的文本文件
cat -b 文件名 对非空文件内容,显示行编号
cat -n 文件名 对输出的所有内容,显示行编号

12. more命令

more命令用于查看内容较多的纯文本文件,格式:more [选项] 文件。

more 文件名 分屏显示文件内容,每次只显示一页内容,适合内容较多的文本文件

使用more的操作键:

  • 空格键:显示手册页的下一屏
  • Enter键:一次滚动手册页的一行b:回滚一屏
  • f:前滚一屏
  • q:退出

13. less命令

less命令用于查看文件的内容,less与more类似,但使用less可以随意浏览文件,而more 仅能向前移动,却不能向后移动,而且less在查看之前不会加载整个文件,格式:less [选项] 文件。

使用less的操作键:more命令的所有按键less都支持

  • 空格键:显示手册页的下一屏
  • Enter键:一次滚动手册页的一行
  • b:回滚一屏
  • f:前滚一屏
  • q:退出
  • ↑↓箭头可以实现一行一行的上下翻
  • PageDown/PageUp可以实现一页一页的上下翻

14. grep命令

grep命令用于在文本中执行关键词搜索,并显示匹配的结果,格式: grep [选项] [文件]。

参数:

  • -n 显示匹配行及行号
  • -v 显示不包含匹配文本的所有行(相当于求反)
  • -i 忽略大小写
  • -c 仅显示找到的行数
  • -b 将可执行文件(binary)当作文本文件(text)来搜索

两种模式查找:

  • ^a 行首,搜索以a开头的行
  • ke$ 行尾,搜索以ke结束的行
  • grep 搜索文本 文件名 搜索文本文件内容
代码语言:javascript复制
grep as 123.txt 搜索as
grep -n as 123.txt 搜索as显示行号
grep -v as 123.txt
grep -vn as 123.txt
grep -i as 123.txt 搜索as忽略大小写
grep -in as 123.txt 搜索as忽略大小写显示行号
grep ^f 123.txt 搜索以f为行首的内容
grep a$ 123.txt 搜索以a为行尾的内容
grep -n a$ 123.txt 搜索以a为行尾的内容,并显示行号

15. find命令

find命令用于按照指定条件来查找文件,格式: find [查找路径] 寻找条件 操作。

在 Linux系统中,搜索工作一般都是通过 find命令来完成的,它可以使用不同的文件特性作为寻找条件(如文件名、大小、修改时间、权限等信息),一旦匹配成功则默认将信息显示到屏幕上。

代码语言:javascript复制
-name 匹配名称
-perm 匹配权限(mode为完全匹配,-mode为包含即可)
-user 匹配所有者
-group 匹配所有组
-mtime -n  n 匹配修改内容的时间(-n指n天以内, n指n天以前)
-atime -n  n 匹配访问文件的时间(-n指n天以内, n指n天以前)
-ctime -n  n 匹配修改文件权限的时间(-n指n天以内, n指n天以前)
-nouser 匹配无所有者的文件
-nogroup 匹配无所有组的文件
-newer f1 !f2 匹配比文件f1新但比f2旧的文件
--type b/d/c/p/l/f 匹配文件类型(后面的字母参数依次表示块设备、目录、字符设备、管道、链接文件、文本文件)
-size 匹配文件的大小( 50KB为查找超过50KB的文件,而-50KB为查找小于50KB的文件)
-prune 忽略某个目录
-exec ...... { }; 后面可跟用于进一步处理搜索结果的命令(下文会有演示)
-exec参数用于把find命令搜索到的结果交由紧随其后的命令作进一步处理,它十分类似于管道符技术,并且由于 find命令对参数的特殊要求,因此虽然 exec是长格式形式,但依然只需要一个减号(-)。
find [路径] -name "*.py" 查找指定路径下扩展名是.py的文件,包括子目录
如果省略路径,表示在当前文件夹下查找
例如:
find Desktop/ -name "*1*" 搜索桌面目录下,文件名包含1的文件
find Desktop/ -name "*.txt" 搜索桌面目录下,所有以.txt为扩展名的文件
find Desktop/ -name "1*" 搜索桌面目录下,以数字1开头的文件
find / -perm -4000 -print 查询整个系统中搜索权限包括SUID权限的所有文件

16. tail 命令

tail命令用于查看纯文本文档的后 N行或持续刷新内容,格式: tail [选项] [文件]。

  • tail -n 20 文件名 查看文本内容的最后20行
  • tail -f 文件名 实时查看文件最新信息

17. head 命令

head命令用于查看纯文本文档的前 N行,格式: head [选项] [文件]。

  • head -n 20 文件名 查看文件的前20行内容

18. tr命令

tr命令用于替换文本文件中的字符,格式: tr [原始字符] [目标字符]。

想要快速地替换文本中的一些内容,可以先使用cat命令读取待处理的文本,然后通过管道符把这些文本内容传递给 tr命令进行替换操作即可。

例如,把file.txt文件中的英文全部替换为大写,但是不改变file.txt文件内容

19. wc命令

wc命令用于统计指定文本的行数、字数、字节数,格式:wc [参数] 文本。

参数:

  • -l 只显示行数
  • -w 只显示单词数
  • -c 只显示字节数

20. stat命令

stat命令用于查看文件的具体存储信息和时间等信息,格式:stat 文件名称。

stat命令可以用于查看文件的存储信息和时间等信息,命令 stat anaconda-ks.cfg会显示出

文件的三种时间状态(已加粗): Access、 Modify、 Change。

21. diff命令

diff命令用于比较两个文本文件的差异,格式:diff [参数] 文件1 文件2。

diff --brief 比较两个文件是否相同 diff -c 详细比较两个文件的差异之处

22. dd命令

dd命令用于按照指定大小和个数的数据块来复制文件或转换文件,格式:dd [参数 ]。

参数:

  • if 输入的文件名称
  • of 输出的文件名称
  • bs 设置每个“块”的大小
  • count 设置要复制的“块”的个数

23. file命令

file命令用于查看文件的类型,格式: file 文件名。

24. vi(Visual interface)命令

vi 文件名 如果文件已存在,会直接打开该文件;如果文件不存在,会新建一个文件

末行模式命令:

  • w 保存
  • q 退出
  • q! 强行退出,不保存退出
  • wq 保存并退出
  • x 保存并退出

25. echo命令

echo命令用于在终端输出字符串或变量提取后的值,格式: echo [字符串| $变量]。

例如: echo hello java 输出hello java

echo $JAVA_HOME 输出java的环境变量JAVA_HOME的路径

26. date命令

参数:

  • %t 跳格[Tab键]
  • %H 小时(00~23)
  • %I 小时(00~12)
  • %M 分钟(00~59)
  • %S 秒(00~59)
  • %j 今年中的第几天
  • %d 日
  • %m 月
  • %Y 年

格式化日期:date " %Y-%m-%d %H:%M:%S",date " %j" 查询今天是今年的第几天

27. cal命令

cal 查看日历,格式:cal [选项]。

  • cal 查看当前月的日历
  • cal -y 查看一年的日历

28. tar命令

tar命令用于对文件进行打包压缩或解压,格式:tar [选项 ] [文件]。

代码语言:javascript复制
tar -zxvf wp.gz -C /home/wwwroot/default

在Linux系统中,常见的文件格式比较多,其中主要使用的是 .tar或 .tar.gz或 .tar.bz2格式。

参数:

  • -c 用于创建压缩文件
  • -x 用于解压文件
  • -t 查看压缩包内有哪些文件
  • -z 用Gzip压缩或解压
  • -j 用bzip压缩或解压
  • -v 显示压缩或解压的过程
  • -f 目标文件名,f后面一定是.tar文件,所以必须放选项最后
  • -p 保留原始的权限与属性
  • -P 使用绝对路径来压缩
  • -C 指定解压到的目录
  • -c和-x 参数不能同时使用
  • 用户使用时则是根据文件的后缀来决定应使用何种格式参数进行解压。
  • tar -cvf 打包文件.tar 被打包的文件/路径(多个文件空格分开) 打包文件
  • tar -xvf 打包文件.tar 解包文件
  • gzip压缩
  • tar -zcvf 打包文件.tar.gz 被压缩的文件/路径... 压缩文件
  • tar -zxvf 打包文件.tar.gz 解压缩文件
  • tar -zxvf 打包文件.tar.gz -C 目标路径 解压缩到指定路径
  • bzip2压缩
  • tar -jcvf 打包文件.tar.gz 被压缩的文件/路径... 压缩文件
  • tar -jxvf 打包文件.tar.gz 解压缩文件
  • tar -jxvf 打包文件.tar.gz -C 目标路径 解压缩到指定路

29. ln 文件链接

ln命令 用来为文件创建链接,链接类型分为硬链接和符号链接两种,默认的链接类型是硬链接。如果要创建符号链接必须使用"-s"选项。

注意:符号链接文件不是一个独立的文件,它的许多属性依赖于源文件,所以给符号链接文件设置存取权限是没有意义的。

代码语言:javascript复制
ln [参数][源文件或目录][目标文件或目录]

# 硬链接
ln /usr/local/python3/bin/python3.exe /usr/bin/python3.exe

#软连接
ln -s /usr/local/redis/bin/* /usr/local/bin '//将redis命令创建软连接,便于系统识别'
29.1 软链接:
  • 软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
  • 软链接可以 跨文件系统 ,硬链接不可以
  • 软链接可以对一个不存在的文件名进行链接
  • 软链接可以对目录进行链接
29.2硬链接

建立硬链接时,在另外的目录或本目录中增加目标文件的一个目录项,这样,一个文件就登记在多个目录中。如下所示的m2.c文件就在目录mub1和liu中都建立了目录项。

  • 硬链接,以文件副本的形式存在。但不占用实际空间。
  • 不允许给目录创建硬链接
  • 硬链接只有在同一个文件系统中才能创建

30.查看目录占用的磁盘空间大小

代码语言:javascript复制
du -h --max-depth=1 

31.source命令

source用于在当前Shell环境中从指定文件读取和执行命令,在一些工具的执行过程中,会把环境变量设置以"export XXX=XXXXXX"或"declare XXX=XXXXXX"的形式导出到 一个文件中,然后用source加载该文件内容到执行环境中,读取和执行/root/.bash_profile文件。

代码语言:javascript复制
source ~/.bash_profile

常见问题

1.bash不显示路径

代码语言:javascript复制
vim ~/.bash_profile
#添加如下文本
export PS1='[u@h W]$'
source ~/.bash_profile

2.清理乱码文件

代码语言:javascript复制
# 使用 ls -i 查看这个文件的ID号;
# find -inum 删除文件ID号 -delete

3.yum: command not found

Yum(全称为 Yellow dogUpdater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。

RPM Package Manager (RPM) 是一个强大的命令行驱动的软件包管理工具,用来安装、卸载、校验、查询和更新 Linux 系统上的软件包。

apt-get update作用是从服务器拉取可用的包到本地

0 人点赞