Linux命令大全

2023年 8月 9日 122.9k 0

Linux命令大全

注意:为了方便代码阅读,文章代码块里把表示管理员模式的#都去掉了。这不是错误。不要搞错!!

一、基本操作命令

首先先来几个热键,非常方便,一定要记住

Tab按键—命令补齐功能

Ctrl+c按键—停掉正在运行的程序

Ctrl+d按键—相当于exit,退出

Ctrl+l按键—清屏

1.1 关机和重启

1.关机命令:shutdown

在linux领域内大多用在服务器上,很少遇到关机的操作。毕竟服务器上跑一个服务是永无止境的,除非特殊情况下,不得已才会关机。

正确的关机流程为:sync > shutdown > reboot > halt

例如你可以运行如下命令关机:

sync 将数据由内存同步到硬盘中。shutdown 关机指令,你可以man shutdown 来看一下帮助文档。例如你可以运行如下命令关机:shutdown –h 10 ‘This server will shutdown after 10 mins’ 这个命令告诉大家,计算机将在10分钟后关机,并且会显示在登陆用户的当前屏幕中。shutdown –h now 立马关机shutdown –h 20:25 系统会在今天20:25关机shutdown –h +10 十分钟后关机shutdown –r now 系统立马重启shutdown –r +10 系统十分钟后重启reboot 就是重启,等同于 shutdown –r nowhalt 关闭系统,等同于shutdown –h now 和 poweroff

登录后复制

下面是一个简单的样例。

Linux命令大全

取消定时关机命令:shutdown -c

最后总结一下,不管是重启系统还是关闭系统,首先要运行 sync 命令,把内存中的数据写到磁盘中。

关机的命令有 shutdown –h now halt poweroff 和 init 0 , 重启系统的命令有 shutdown –r now reboot init 6。

2.重启命令:reboot

Linux命令大全

1.2 帮助命令

–-help命令

shutdown --help:ifconfig --help:查看网卡信息

登录后复制

man命令(命令说明书)

man shutdown注意:man shutdown 打开命令说明书之后,使用按键q退出

登录后复制二、目录操作命令

我们知道Linux的目录结构为树状结构,最顶级的目录为根目录 /。

其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们。

首先我们需要先知道什么是绝对路径与相对路径。

  • 绝对路径:路径的写法,由根目录 / 写起,例如:/usr/share/doc 这个目录。

  • 相对路径:路径的写法,不是由 / 写起,例如由/usr/share/doc 要到 /usr/share/man 底下时,可以写成:cd ../man 这就是相对路径的写法啦!

2.1 目录切换 cd

命令:cd 目录

cd是Change Directory的缩写,这是用来变换工作目录的命令。

cd / 切换到根目录cd /usr 切换到根目录下的usr目录cd ../ 切换到上一级目录 或者 cd ..cd ~ 切换到home目录cd - 切换到上次访问的目录

登录后复制

2.2 目录查看 ls [-al]

命令:ls [-al]

语法:

ls [-aAdfFhilnrRSt] 目录名称ls [--color={never,auto,always}] 目录名称ls [--full-time] 目录名称

登录后复制

ls 查看当前目录下的所有目录和文件ls -a 查看当前目录下的所有目录和文件(包括隐藏的文件)ls -l 或 ll 列表查看当前目录下的所有目录和文件(列表查看,显示更多信息)ls /dir 查看指定目录下的所有目录和文件 如:ls /usr

将家目录下的所有文件列出来(含属性与隐藏档)

ls -al ~

登录后复制

2.3 目录操作【增,删,改,查】

2.3.1 创建目录【增】 mkdir

如果想要创建新的目录的话,那么就使用mkdir (make directory)吧。

语法:

mkdir [-mp] 目录名称

登录后复制

选项与参数:

  • -m :配置文件的权限喔!直接配置,不需要看默认权限 (umask) 的脸色~

  • -p :帮助你直接将所需要的目录(包含上一级目录)递归创建起来!

实例:请到/tmp底下尝试创建数个新目录看看:

cd /tmp[root@www tmp] mkdir test = != == 关系运算符 空格 连接 + - 加,减 * / % 乘,除与求余 + - ! 一元加,减和逻辑非 ^ * 求幂 ++ – 增加或减少,作为前缀或后缀 $ 字段引用 in 数组成员

过滤第一列大于2的行

$ awk '$1>2' log.txt #命令#输出3 Are you like awkThis's a test10 There are orange,apple,mongo12345

登录后复制

过滤第一列等于2的行

$ awk '$1==2 {print $1,$3}' log.txt #命令#输出2 is123

登录后复制

过滤第一列大于2并且第二列等于’Are’的行。另外,搜索公众号Java架构师技术后台回复“面试题”,获取一份惊喜礼包。

$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令#输出3 Are you123

登录后复制

内建变量

变量 描述
$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)

$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4sn","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4sn",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txtFILENAME ARGC FNR FS NF NR OFS ORS RS---------------------------------------------log.txt 2 1 5 1log.txt 2 2 5 2log.txt 2 3 3 3log.txt 2 4 4 4$ awk -F' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4sn","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4sn",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txtFILENAME ARGC FNR FS NF NR OFS ORS RS---------------------------------------------log.txt 2 1 ' 1 1log.txt 2 2 ' 1 2log.txt 2 3 ' 2 3log.txt 2 4 ' 1 4# 输出顺序号 NR, 匹配文本行号$ awk '{print NR,FNR,$1,$2,$3}' log.txt---------------------------------------------1 1 2 this is2 2 3 Are you3 3 This's a test4 4 10 There are# 指定输出分割符$ awk '{print $1,$2,$5}' OFS=" $ " log.txt---------------------------------------------2 $ this $ test3 $ Are $ awkThis's $ a $10 $ There $

登录后复制

使用正则,字符串匹配

# 输出第二列包含 "th",并打印第二列与第四列$ awk '$2 ~ /th/ {print $2,$4}' log.txt---------------------------------------------this a

登录后复制

~ 表示模式开始。// 中是模式。

# 输出包含 "re" 的行$ awk '/re/ ' log.txt---------------------------------------------3 Are you like awk10 There are orange,apple,mongo

登录后复制

忽略大小写

$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt---------------------------------------------2 this is a testThis's a test

登录后复制

模式取反

$ awk '$2 !~ /th/ {print $2,$4}' log.txt---------------------------------------------Are likeaThere orange,apple,mongo$ awk '!/th/ {print $2,$4}' log.txt---------------------------------------------Are likeaThere orange,apple,mongo

登录后复制

awk脚本

关于 awk 脚本,我们需要注意两个关键词 BEGIN 和 END。

  • BEGIN{ 这里面放的是执行前的语句 }

  • END {这里面放的是处理完所有的行后要执行的语句 }

  • {这里面放的是处理每一行时要执行的语句}

假设有这么一个文件(学生成绩表):

$ cat score.txtMarry 2143 78 84 77Jack 2321 66 78 45Tom 2122 48 77 71Mike 2537 87 97 95Bob 2415 40 57 62

登录后复制

我们的 awk 脚本如下:

$ cat cal.awk#!/bin/awk -f#运行前BEGIN { math = 0 english = 0 computer = 0 printf "NAME NO. MATH ENGLISH COMPUTER TOTALn" printf "---------------------------------------------n"}#运行中{ math+=$3 english+=$4 computer+=$5 printf "%-6s %-6s %4d %8d %8d %8dn", $1, $2, $3,$4,$5, $3+$4+$5}#运行后END { printf "---------------------------------------------n" printf " TOTAL:%10d %8d %8d n", math, english, computer printf "AVERAGE:%10.2f %8.2f %8.2fn", math/NR, english/NR, computer/NR}123456789101112131415161718192021222324

登录后复制

我们来看一下执行结果:

$ awk -f cal.awk score.txtNAME NO. MATH ENGLISH COMPUTER TOTAL---------------------------------------------Marry 2143 78 84 77 239Jack 2321 66 78 45 189Tom 2122 48 77 71 196Mike 2537 87 97 95 279Bob 2415 40 57 62 159--------------------------------------------- TOTAL: 319 393 350AVERAGE: 63.80 78.60 70.00

登录后复制

另外一些实例

AWK 的 hello world 程序为:

BEGIN { print "Hello, world!" }

登录后复制

计算文件大小

$ ls -l *.txt | awk '{sum+=$5} END {print sum}'--------------------------------------------------666581

登录后复制

从文件中找出长度大于 80 的行:

awk 'length>80' log.txt

登录后复制

打印九九乘法表

seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i drink beer ?'1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologinDrink tea or ......drink beer ?3 daemon:x:2:2:daemon:/sbin:/sbin/nologin.....(后面省略).....

登录后复制

每一行之间都必须要以反斜杠『 』来进行新行的添加喔!所以,上面的例子中,我们可以发现在第一行的最后面就有 存在。

以行为单位的替换与显示

将第2-5行的内容取代成为『No 2-5 number』呢?

[root@www ~] nl /etc/passwd | sed '2,5c No 2-5 number'1 root:x:0:0:root:/root:/bin/bashNo 2-5 number6 sync:x:5:0:sync:/sbin:/bin/sync.....(后面省略).....

登录后复制

透过这个方法我们就能够将数据整行取代了!

仅列出 /etc/passwd 文件内的第 5-7 行

[root@www ~] nl /etc/passwd | sed -n '5,7p'5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

登录后复制

可以透过这个 sed 的以行为单位的显示功能, 就能够将某一个文件内的某些行号选择出来显示。

数据的搜寻并显示

搜索 /etc/passwd有root关键字的行

nl /etc/passwd | sed '/root/p'1 root:x:0:0:root:/root:/bin/bash1 root:x:0:0:root:/root:/bin/bash2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh3 bin:x:2:2:bin:/bin:/bin/sh4 sys:x:3:3:sys:/dev:/bin/sh5 sync:x:4:65534:sync:/bin:/bin/sync....下面忽略

登录后复制

如果root找到,除了输出所有行,还会输出匹配行。

使用-n的时候将只打印包含模板的行。

nl /etc/passwd | sed -n '/root/p'1 root:x:0:0:root:/root:/bin/bash

登录后复制

数据的搜寻并删除

删除/etc/passwd所有包含root的行,其他行输出

nl /etc/passwd | sed '/root/d'2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh3 bin:x:2:2:bin:/bin:/bin/sh....下面忽略#第一行的匹配root已经删除了

登录后复制

数据的搜寻并执行命令

搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:

nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p;q}' 1 root:x:0:0:root:/root:/bin/blueshell

登录后复制

最后的q是退出。

数据的搜寻并替换

除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!他有点像这样:

sed 's/要被取代的字串/新的字串/g'

登录后复制

先观察原始信息,利用 /sbin/ifconfig 查询 IP

[root@www ~] /sbin/ifconfig eth0eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1.....(以下省略).....

登录后复制

本机的ip是192.168.1.100。

将 IP 前面的部分予以删除

[root@www ~] /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

登录后复制

接下来则是删除后续的部分,亦即:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

将 IP 后面的部分予以删除

[root@www ~] /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'192.168.1.100

登录后复制

多点编辑

一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell

nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'1 root:x:0:0:root:/root:/bin/blueshell2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh

登录后复制

-e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bash替换为blueshell。

直接修改文件内容(危险动作)

sed 可以直接修改文件的内容,不必使用管道命令或数据流重导向!不过,由於这个动作会直接修改到原始的文件,所以请你千万不要随便拿系统配置来测试!我们还是使用文件 regular_express.txt 文件来测试看看吧!

regular_express.txt 文件内容如下:

[root@www ~] cat regular_express.txt runoob.google.taobao.facebook.zhihu-weibo-

登录后复制

利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !

[root@www ~] sed -i 's/.$/!/g' regular_express.txt[root@www ~] cat regular_express.txt runoob!google!taobao!facebook!zhihu-weibo-

登录后复制

:q:q

利用 sed 直接在 regular_express.txt 最后一行加入 # This is a test:

[root@www ~] sed -i '$a # This is a test' regular_express.txt[root@www ~] cat regular_express.txt runoob!google!taobao!facebook!zhihu-weibo-# This is a test

登录后复制

由於 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增 # This is a test!

sed 的 -i 选项可以直接修改文件内容,这功能非常有帮助!举例来说,如果你有一个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!因为文件太大了!那怎办?就利用 sed 啊!透过 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修订!

追加行的说明:

sed -e 4anewLine testfile

登录后复制登录后复制

a 动作是在匹配的行之后追加字符串,追加的字符串中可以包含换行符(实现追加多行的情况)。

追加一行的话前后都不需要添加换行符 n,只有追加多行时在行与行之间才需要添加换行符(最后一行最后也无需添加,添加的话会多出一个空行)。

man sed 信息:

Append text, which has each embedded newline preceded by a backslash.

登录后复制

例如:

4 行之后添加一行:

sed -e '4 a newline' testfile

登录后复制

4 行之后追加 2 行:

sed -e '4 a newlinennewline2' testfile

登录后复制

4 行之后追加 3 行(2 行文字和 1 行空行)

sed -e '4 a newlinennewline2n' testfile

登录后复制

4 行之后追加 1 行空行:

#错误:sed -e '4 a n' testfilesed -e '4 a ' testfile 实际上

登录后复制

实际上是插入了一个含有一个空格的行,插入一个完全为空的空行没有找到方法(不过应该没有这个需求吧,都要插入行了插入空行干嘛呢?)

添加空行:

# 可以添加一个完全为空的空行sed '4 a \'# 可以添加两个完全为空的空行sed '4 a \n'

登录后复制

8.3 grep

Linux grep 命令用于查找文件里符合条件的字符串。

grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。

语法

grep [-abcEFGhHilLnqrsvVwxy][-A][-B][-C][-d][-e][-f][--help][范本样式][文件或目录...]

登录后复制

参数:

  • -a 或 —text : 不要忽略二进制的数据。

  • -A 或 —after-context= : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。

  • -b 或 —byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。

  • -B 或 —before-context= : 除了显示符合样式的那一行之外,并显示该行之前的内容。

  • -c 或 —count : 计算符合样式的列数。

  • -C 或 —context=或- : 除了显示符合样式的那一行之外,并显示该行之前后的内容。

  • -d 或 —directories= : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。

  • -e 或 —regexp= : 指定字符串做为查找文件内容的样式。

  • -E 或 —extended-regexp : 将样式为延伸的正则表达式来使用。

  • -f 或 —file= : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。

  • -F 或 —fixed-regexp : 将样式视为固定字符串的列表。

  • -G 或 —basic-regexp : 将样式视为普通的表示法来使用。

  • -h 或 —no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。

  • -H 或 —with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。

  • -i 或 —ignore-case : 忽略字符大小写的差别。

  • -l 或 —file-with-matches : 列出文件内容符合指定的样式的文件名称。

  • -L 或 —files-without-match : 列出文件内容不符合指定的样式的文件名称。

  • -n 或 —line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。

  • -o 或 —only-matching : 只显示匹配PATTERN 部分。

  • -q 或 —quiet或–silent : 不显示任何信息。

  • -r 或 —recursive : 此参数的效果和指定”-d recurse”参数相同。

  • -s 或 —no-messages : 不显示错误信息。

  • -v 或 —revert-match : 显示不包含匹配文本的所有行。

  • -V 或 —version : 显示版本信息。

  • -w 或 —word-regexp : 只显示全字符合的列。

  • -x —line-regexp : 只显示全列符合的列。

  • -y : 此参数的效果和指定”-i”参数相同。

实例

1、在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:

grep test *file

登录后复制

结果如下所示:

$ grep test test* #查找前缀有“test”的文件包含“test”字符串的文件 testfile1:This a Linux testfile! #列出testfile1 文件中包含test字符的行 testfile_2:This is a linux testfile! #列出testfile_2 文件中包含test字符的行 testfile_2:Linux test #列出testfile_2 文件中包含test字符的行

登录后复制

2、以递归的方式查找符合条件的文件。例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串”update”的文件,并打印出该字符串所在行的内容,使用的命令为:

grep -r update /etc/acpi

登录后复制

输出结果如下:

$ grep -r update /etc/acpi #以递归的方式查找“etc/acpi” #下包含“update”的文件 /etc/acpi/ac.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of IO.) Rather than /etc/acpi/resume.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of IO.) Rather than /etc/acpi/events/thinkpad-cmos:action=/usr/sbin/thinkpad-keys--update

登录后复制

3、反向查找。前面各个例子是查找并打印出符合条件的行,通过”-v”参数可以打印出不符合条件行的内容。

查找文件名中包含 test 的文件中不包含test 的行,此时,使用的命令为:

grep -v test *test*

登录后复制

结果如下所示:

$ grep-v test* #查找文件名中包含test 的文件中不包含test 的行 testfile1:helLinux! testfile1:Linis a free Unix-type operating system. testfile1:Lin testfile_1:HELLO LINUX! testfile_1:LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM. testfile_1:THIS IS A LINUX TESTFILE! testfile_2:HELLO LINUX! testfile_2:Linux is a free unix-type opterating system.

登录后复制

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论