
注意:为了方便代码阅读,文章代码块里把表示管理员模式的#都去掉了。这不是错误。不要搞错!!
一、基本操作命令
首先先来几个热键,非常方便,一定要记住
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
登录后复制
下面是一个简单的样例。

取消定时关机命令:shutdown -c
最后总结一下,不管是重启系统还是关闭系统,首先要运行 sync 命令,把内存中的数据写到磁盘中。
关机的命令有 shutdown –h now halt poweroff 和 init 0 , 重启系统的命令有 shutdown –r now reboot init 6。
2.重启命令:reboot

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 = != ==
过滤第一列大于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.
登录后复制


