目录
一、系统文件结构和内部命令、外部命令和
1、系统文件结构
2、内部命令、外部命令
命令分为内部命令和外部命令
命令结构
根据空格切割字符串,第一个位置为命令,其他位置为命令参数
命令 | 描述 |
---|---|
type | 查看命令是 内部命令 还是 外部命令 (shell自带的命令为内部命令) |
help | 查看帮助文档命令(主要查内部命令) |
man | 查看帮助文档命令manual的简写(主要查外部命令) 注意:man命令如果不识别可以通过 yum install man 来安装man |
whereis | 查看命令的可执行文件路径 |
file | 查看文件类型 |
cat | 查看可执行文件的内容 |
echo | 打印输出(相当于system.out.println) |
clear | 清屏 |
su su - | Linux su(英文全拼:swith user)命令用于变更为其他使用者的身份 su - root :切换至管理员 root 权限(或使用 su root)
su 和 su - 都可用作linux方面来切换用户,但它们的不同的之处,在于 su : 切换到目标用户,只是切换了身份,但环境变量没有切换过来 |
shutdown | 关机指令 shutdown -h now :立即关机 shutdown -h +10(或10) :十分钟后关机 shutdown -h 20:02 :系统将在20:02关机 shutdown -r now :立即重启系统 shutdown -r +10 :十分钟后重启 |
reboot | 重启指令 |
二、文件系统命令
1、如何识别文件类型
首先,通过 ls -l 命令打印出详细信息如下
第1位是:类型标识
- 【-】:普通文件(file)
- 【d】:目录文件(文件夹),代表directory
- 【b】:块设备文件(block)
- 【c】:字符设备文件(character)
- 【l】:符号链接文件(symbolic link file)
- 【p】:命令管道文件(pipe)
- 【s】:套接字文件(socket)
第2~10位是:文件权限;每三位一组,共三组(共9位)
分别代表:属主权限(owner) > 组权限(group) > 其他人的权限(other)
- 【r】=read;
- 【w】=write;
- 【x】=execute
例如:drwxr-xr-x表示(d rwx r-x r-x)
d:这是一个文件夹
rwx:第一组;属主权限(创建者)为读、写、执行
r-x:第二组;组权限为读、执行
r-x:第三组;其他人权限为读、执行
2、各种查看命令
命令 | 描述 |
---|---|
cd | 切换文件路径 |
df | 显示磁盘使用情况(查看分区信息) df:KB的形式显示 df -h:GB的形式显示(推荐) |
du | 显示文件系统使用情况(查看文件、文件夹信息) du:不显示单位 du -h:显示单位(推荐) |
pwd | 打印出当前(工作目录)的路径 |
ls | LS命令展示路径下所有的文件和文件夹 ls -l:每行一个的列出目录清单(详细信息) ls -a:可显示隐藏文件 |
ll | 是上面 ls -l 的简写 |
stat | 查看文件、文件夹详细信息(类似于Windows右键属性里看到的信息) stat 文件名 |
3、文件文件夹的增、删、改、查、移动操作
命令 | 描述 |
---|---|
mkdir | 创建目录文件夹(Make directory) mkdir :创建目录(创建目录路径父文件夹必须存在,否则报错) mkdir -p:级联创建目录,创建父文件夹若不存在一起创建(例如:a/worke/b) mkdir 文件名 文件名 :一次创建多个文件夹(例如:mkdir a/1dir a/2dir a/3dir) mkdir 文件前缀{内容1,内容2}文件后缀:一次创建多个文件夹(例如:mkdir a/{1,2,3}dir) |
touch | 1、创建文件 touch 文件名:如果文件不存在,则创建的是空文件,文件大小为0(例如:touch test.txt)
2、更改文件时间戳 touch 文件名:如果文件存在,更新该文件的时间戳,不改变文件(例如:touch test.txt) touch -a 文件名:与上面相同,只更新该文件的时间戳,不改变文件(例如:touch -a test.txt)
|
cat | 查看可执行文件的内容 Ctrl + z 退出 cat 命令 |
cp | 拷贝(copy) 1、拷贝文件 cp 需要拷贝的目标文件路径 ./ :将目标文件拷贝到当前目录下 ./ 表示当前目录(例如:cp /root/anaconda-ks.cfg ./) cp 需要拷贝的目标文件路径 拷贝到目的地路径 :将目标文件拷贝到目的地路径下(例如:cp /etc/passwd /root/test/1)
2、拷贝文件夹(文件夹:-r) cp -r 需要拷贝的目标文件夹 空格 拷贝到的目标路径/:(例如:cp -r 1dir demo/) cp -r 绝对路径/文件 拷贝到目的地路径:-r 递归子目录(cp -r 绝对路径/*.wav 目标路径) cp -r 文件夹名/* ./:copy 一个目录下的所有文件以及递归文件 到当前文件夹 |
mv | 1、移动(move) mv 当前文件名(或路径) 空格 移动到的目标路径/:(例如:mv anaconda-ks.cfg 1dir/) 2、修改文件名 mv 当前文件名 空格 新文件名:(例如:mv anaconda-ks.cfg demo.bak) |
rm | 删除(remove) 1、删除文件 rm 文件名:删除文件,有提示是否确认删除,需要yes(例如:rm hello) rm -f 文件名:删除文件不需要提示,直接删除(例如:rm -f hello)
2、删除文件夹(文件夹:-r) rm -r 文件名:删除文件夹,有提示是否确认删除,需要yes(例如:rm -r 1dir ) rm -r -f 文件名:删除文件夹不需要提示,直接删除(例如:rm -r -f 1dir ) |
ln | |
chmod | 改变文件模式位(修改文件权限) chmod o+w 文件名:为文件 o(other)角色添加w(write)权限 |
三、查询筛选系列
1、正则表达式(grep)【重要】
Linux的正则表达式和平常用法几乎是一样的
使用 grep 命令来执行正则表达式(可以搭配许多命令进行查询,如:结合管道查文件名)
[root@centOS-1 ~]# ls anaconda-ks.cfg install.log install.log.syslog profile test [root@centOS-1 ~]# ls | grep "l" install.log install.log.syslog profile
1、匹配操作符
2、重复操作符
3、其他操作
4、正则练习
在下列内容中按规匹配
hello msb
hello angelababy
hello dilireba
iiii250 wyf
hello zhangxinyi
11 hel mhellosbjy lo
h2341123i bj
ili521 fanbingbing
111 hello 222
wo ai bj tam
(1)查找包含hello的行
grep "hello" file2.txt
[root@centOS-1 1]# grep "hello" file2.txt
hello msb
hello angelababy
hello dilireba
hello zhangxinyi
11 hel mhellosbjy lo
111 hello 222
(2)查找包含数字的行
grep "[1-9]" file2.txt
[root@centOS-1 1]# grep "[1-9]" file2.txt
iiii250 wyf
11 hel mhellosbjy lo
h2341123i bj
ili521 fanbingbing
111 hello 222
(3)查找包含了 2 或者 5 的行
grep "[25]" file2.txt
[root@centOS-1 1]# grep "[25]" file2.txt
iiii250 wyf
h2341123i bj
ili521 fanbingbing
111 hello 222
(4)查找至少包含3位数的行( {} 是扩展正则表达式的字符,需要加 \ 或者使用 grep -E)
grep -E "[0-9]{3}" file2.txt
grep "[0-9]\{3\}" file2.txt
[root@centOS-1 1]# grep -E "[0-9]{3}" file2.txt
iiii250 wyf
h2341123i bj
ili521 fanbingbing
111 hello 222
[root@centOS-1 1]# grep "[0-9]\{3\}" file2.txt
iiii250 wyf
h2341123i bj
ili521 fanbingbing
111 hello 222
(5)包含hello这个单词的行找出来
grep "\<hello\>" file2.txt
[root@centOS-1 1]# grep "\<hello\>" file2.txt
hello msb
hello angelababy
hello dilireba
hello zhangxinyi
111 hello 222
(6)包含小写L,出现2到3次的行
grep "l\{2,3\}" file2.txt
[root@centOS-1 1]# grep "l\{2,3\}" file2.txt
hello msb
hello angelababy
hello dilireba
hello zhangxinyi
11 hel mhellosbjy lo
111 hello 222
(7)在下面内容中筛选
hello msb?
hello angelababy?
hello dilireba?
iiii250 wyf?
hello zhangxinyi
11 hel mhellosbjy lo?
h2341123i bj
ili521 fanbingbing
111 hello 222
wo ai bj tam
hiahelloahiahello
helloahiahelloahi
[root@centOS-1 1]# grep "hi.*hello.*hi.*hello.*" file2.txt
hiahelloahiahello
[root@centOS-1 1]# grep "\(hi.*\)\(hello.*\).*\1.*\2" file2.txt
hiahelloahiahello
2、管道的使用【重要】
什么是管道:竖杠【|】就是管道
如下图:管道 左边 是 输出流 的形式将 内容给了右侧,管道 右侧 是以 输入流 的形式 接收
四、echo定义变量
直接输出
[root@centOS-1 /]# echo a
a
定义后输出定义对象值(读对象使用$)
[root@centOS-1 /]# a=haha
[root@centOS-1 /]# echo $a
haha
定义数组并读取值
[root@centOS-1 /]# arr=(marvin jerry sally)
[root@centOS-1 /]# echo ${arr[0]}
marvin
[root@centOS-1 /]# echo ${arr[1]}
jerry
[root@centOS-1 /]# echo ${arr[2]}
sally
五、文本相关命令
1、文件查看
命令 | 描述 |
---|---|
cat | 查看可执行文件的所有内容,到内容结尾处 |
more | 查看可执行文件的所有内容,从内容开头处开始,空格键往后翻 |
less | 查看可执行文件的所有内容,从内容开头处开始,b键往前翻,空格键往后翻 注意:文件会完整加载到内存中,从而实现来回翻页,但需要考虑文件不能超出内存大小 |
head | 查看可执行文件的内容,从内容开头处开始,选择行数打印 head 文件名:默认打印文件前10行(例如:head /etc/profile) head -5 文件名:打印文件前5行(例如:head -5 /et/profile ) |
tail | 查看可执行文件的内容,从内容末尾处,选择行数打印 tail 文件名:默认打印文件最后10行(例如:tail /etc/profile) tail -5 文件名:打印文件最后5行(例如:tail -5 /etc/profile ) tail -f 文件名:如果有一个进程,在向文件中写数据 tail -f 监控这个文件,有增量数据就立即打印 |
2、管道的使用(重要)
什么是管道:竖杠【|】就是管道
如下图:管道 左边 是 输出流 的形式将 内容给了右侧,管道 右侧 是以 输入流 的形式 接收
案例1:我们只取zfg中的第5条记录怎么么做?
解答:如下图,我们先获取前5条记录,传入管道右侧,然后右侧再取接收的最后一条数据
六、文本编辑器(vi)
1、进入文件编辑模式
通过【vi 文件名】 命令进入该文件的vi编辑模式
命令 | 描述 |
---|---|
vi 文件名 | 进入该文件的vi编辑模式,光标处于文件内容首行 |
vi +10 文件名 | 进入该文件的vi编辑模式,光标处于文件内容第10行 |
vi + 文件名 | 进入该文件的vi编辑模式,光标处于文件内容尾行 |
2、编辑内容操作
使用 vi 进入编辑模式后,按【i】 进入文本输入模式,下面会出现 insert 标识
(1)复制、粘贴
命令 | 描述 |
---|---|
yw | 复制 光标所在位置的单词(一个单词) |
yy | 复制 光标所在行(一行) |
p | 粘贴 复制的内容(小写p:从光标位置下方粘贴) |
P | 粘贴 复制的内容(大写p:从光标位置上方粘贴) |
(2)删除
命令 | 描述 |
---|---|
dd | 删除当前行 |
ndd | 删除n行数据 |
dG | 删除当前后之后的全部行 |
(3)撤销、恢复 、重复上一步骤
命令 | 描述 |
---|---|
u | 撤销 上一步操作 |
ctrl + r | 恢复 上一步操作 |
. | 点【.】重复 上一步操作 |
3、退出编辑模式
按ESC键,表示退出文本输入模式,进入编辑模式(insert 标识消失)
命令 | 描述 |
---|---|
:q | 没修改内容,退出(注意:如果修改了,不会直接退出,会告诉你文件被改变了) |
:q! | 不保存文件,强制退出vi命令 |
:wq | 保存文件,退出vi命令 |
:w | 保存文件,不退出vi命令 |
:w! | 强制保存 |
4、末行模式
末行模式:就是处于编辑模式下最后一行的操作命令
命令 | 描述 |
---|---|
:set number | 显示行号,文件内容的每一行设置编号(行号):set nu 是缩写格式 |
:set nonumber | 隐藏行号 :set nonu 是缩写格式 |
:set readonly | 设置文件为只读模式(注意:如果改变后,是不能保存的,会有提示) |
:/ 查找内容 | 向下查找内容(文字)(例如: :/after 会找到文件中的 after)小写 n 是从上往下找,大写 N 是从下往上找 |
:? 查找内容 | 向上查找内容(文字) |
:s | 查找替换命令 :s/查找的目标/替换的目标 :查找 光标所在的行中第一个目标 并 替换(例如 ::s/after/befor) :s/查找的目标/替换的目标/g :查找 光标所在的行中所有目标 并 替换(例如 ::s/after/befor/g) :s/查找的目标/替换的目标/gi :不区分大小写 查找 光标所在的行中所有目标 并 替换(例如 ::s/after/befor/gi) |
:! 命令 | 末行模式下,执行一些命令 |
:起始行,结束行d | 按行号范围删除行(例如: :3,5d 表示删除3至5行) |
:起始行,结束行y | 按行号范围复制行(例如: :3,5y 表示复制3至5行) |
下图的范围命令是重点
七、bash shell进程简单管理
命令 | 描述 |
---|---|
echo $$ | 打印当前bash shell的进程号 |
ps -ef | 打印linux系统下所启用的进程信息和进程号 |
kill -9 进程号 | 关闭此进程(如:kill -9 1115) |
[root@centOS-1 /]# echo $$
1115
[root@centOS-1 /]# kill -9 1115
八、行编辑器(sed)
以行为单位进行处理,可以将数据行进行、删除、新增、选取等特定工作
使用命令:
sed [options] 'Command' file ...
options
command
九、文本分析工具(awk)
awk是一个强大的文本分析工具
相对于 grep 的查找,sed 的编辑,awk 在其对数据分析并生成报告是,显得尤为强大。
简单来说 awk 就是把文件逐行的读入,(空格,制表符)为默认分隔符将每行切片,切开的部分再进行各种分析处理
练习一
下面是文件内容
[root@centOS-1 1]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
1、只显示/etc/passwd的账户
-F :表示声明自定义分隔符,以什么为分隔条件( -F ':')
print $1: 表示打印分隔后的第一个分隔段($n:第n个分隔断)
passwd:操作文件名
[root@centOS-1 1]# awk -F ':' '{print $1}' passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
uucp
operator
games
gopher
ftp
nobody
vcsa
saslauth
postfix
sshd
2、只显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且每行以(name:参数,shell:参数)的形式显示,在起始行添加“start”最后一行添加“end”
[root@centOS-1 1]# awk -F ':' 'BEGIN{print "start"}{print "name:" $1 " ,shell:" $7 }END{print "end"}' passwd
start
name:root ,shell:/bin/bash
name:bin ,shell:/sbin/nologin
name:daemon ,shell:/sbin/nologin
name:adm ,shell:/sbin/nologin
name:lp ,shell:/sbin/nologin
name:sync ,shell:/bin/sync
name:shutdown ,shell:/sbin/shutdown
name:halt ,shell:/sbin/halt
name:mail ,shell:/sbin/nologin
name:uucp ,shell:/sbin/nologin
name:operator ,shell:/sbin/nologin
name:games ,shell:/sbin/nologin
name:gopher ,shell:/sbin/nologin
name:ftp ,shell:/sbin/nologin
name:nobody ,shell:/sbin/nologin
name:vcsa ,shell:/sbin/nologin
name:saslauth ,shell:/sbin/nologin
name:postfix ,shell:/sbin/nologin
name:sshd ,shell:/sbin/nologin
end
3、搜索/etc/passwd有root关键字的所有行
$0:打印整行
[root@centOS-1 1]# awk '/root/ {print $0}' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
4、统计/etc/passwod文件中,每行的行号,每行的列数,对应的完整行内容
[root@centOS-1 1]# awk -F ':' '{print NR "\t" NF "\t" $0}' passwd
1 7 root:x:0:0:root:/root:/bin/bash
2 7 bin:x:1:1:bin:/bin:/sbin/nologin
3 7 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 7 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 7 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 7 sync:x:5:0:sync:/sbin:/bin/sync
7 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 7 halt:x:7:0:halt:/sbin:/sbin/halt
9 7 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 7 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
11 7 operator:x:11:0:operator:/root:/sbin/nologin
12 7 games:x:12:100:games:/usr/games:/sbin/nologin
13 7 gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
14 7 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
15 7 nobody:x:99:99:Nobody:/:/sbin/nologin
16 7 vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
17 7 saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
18 7 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
19 7 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
练习二
题目:统计报表,合计每人1月工资
0:manager
1:worker
[root@centOS-1 1]# cat staff Tom 0 2012-12-11 car 3000 John 1 2013-01-13 bike 1000 vivi 1 2013-01-18 car 2800 Tom 0 2013-01-20 car 2500 John 1 2013-01-28 bike 3500
答案:
[root@centOS-1 1]# awk '{split($3,date,"-");if(date[2]=="01"){names[$1]+=$5}} END{for(i in names) print i "\t" names[i]}' staff
vivi 2800
Tom 2500
John 4500
[root@centOS-1 1]# awk '{split($3,date,"-");if(date[2]=="01"){names[$1]+=$5};if($2=="0"){roles[$1]="Manager"}else{roles[$1]="Worker"}} END{for(i in names) print i "\t" roles[i] "\t" names[i]}' staff
vivi Worker 2800
Tom Manager 2500
John Worker 4500
命令太长很麻烦,可以使用vim 脚本文件,将命令写入脚本中直接执行
如果vim不识别,请安装
安装命令:默认情况下 centos正常安装后yum已经配好,有等同于vim的vi。
因此使用vim的时候会报出 -bash : vim: command not found 的错误
安装命令:
rpm -qa | grep vim // 查看vim命令在什么软件包
出现 vim-minimal-7.4.160-4.el7.x86_64
yum install -y vim* //安装vim相关的软件包
rpm -qa | grep vim
结果如下
创建一个 脚本文件(我这里叫script)
[root@centOS-1 1]# vim script
{
split($3,date,"-");
if(date[2]=="01"){
names[$1]+=$5
};
if($2=="0"){
roles[$1]="Manager"
}else{
roles[$1]="Worker"
}
}
END{
for(i in names)
print i "\t" roles[i] "\t" names[i]
}
命令:awk -f 脚本文件名 需要执行的文件名
-f :program-file(程序文件)
[root@centOS-1 1]# awk -f script staff
vivi Worker 2800
Tom Manager 2500
John Worker 4500