Linux操作
基础命令
命令
查看目录命令的使用
命令 | 说明 |
---|---|
ls | 查看当前目录信息 |
tree | 以树状方式显示目录信息 |
pwd | 查看当前目录路径 |
clear | 清除终端内容 |
切换目录命令
命令 | 说明 |
---|---|
cd 目录 | 切换到指定目录 |
cd ~ | 切换到当前用户的主目录 |
cd … | 切换到上一级目录 |
cd . | 切换到当前目录 |
cd - | 切换到上一次目录 |
创建、删除文件及目录命令
命令 | 说明 |
---|---|
touch 文件名 | 创建指定文件 |
mkdir 目录名 | 创建目录(文件夹) |
rm 文件名或者目录名 | 删除指定文件或者目录 |
rmdir 目录名 | 删除空目录 |
- rm命令想要删除目录需要加上-r选项,-r表示递归删除目录及其内容
复制、移动文件及目录命令
命令 | 说明 |
---|---|
cp | 拷贝文件、拷贝目录 |
mv | 移动文件、移动目录、重命名 |
- 拷贝目录需要加上-r选项,-r表示递归拷贝目录及其内容
终端命令格式的组成
command [-options] [parameter]
command:命令名, 比如: ls、pwd
[-options]:选项,可以有零个、一个或者多个选项,多个选项可以合并,比如使用的-r 就是选项。
[parameter]:参数,可以有零个、一个或者多个参数, 比如文件名和目录名都是参数。
[]:代表可选
命令选项
查看命令帮助
–help 使用说明: 命令–help
man 使用说明: man 命令
man命令的说明:
命令 | 说明 |
---|---|
空格 | 显示下一屏信息 |
回车 | 显示下一行信息 |
b | 显示上一屏信息 |
f | 显示下一屏信息 |
q | 退出 |
ls命令选项
命令选项 | 说明 |
---|---|
-l | 以列表方式显示 |
-h | 以大小单位显示,默认是字节 |
-a | 显示隐藏文件和隐藏目录 |
mkdir命令选项
命令选项 | 说明 |
---|---|
-p | 创建所依赖的文件夹 |
rm命令选项
命令选项 | 说明 |
---|---|
-i | 交互式提示 |
-r | 递归删除目录及其内容 |
-f | 强制删除,忽略不存在的文件,无需提示 |
-d | 删除空目录 |
cp命令选项
命令选项 | 说明 |
---|---|
-i | 交互式提示 |
-r | 递归拷贝目录及其内容 |
-v | 显示拷贝后的路径描述 |
-a | 保留文件的原有权限 |
- -a 选项还支持拷贝文件夹并且文件夹中的文件权限不丢失
mv命令选项
命令选项 | 说明 |
---|---|
-i | 交互式提示 |
-v | 显示移动后的路径描述 |
高级命令
重定向命令
命令 | 说明 |
---|---|
> | 如果文件存在会覆盖原有文件内容,相当于文件操作中的’w’模式 |
>> | 如果文件存在会追加写入文件末尾,相当于文件操作中的’a’ 模式 |
查看文件内容命令
命令 | 说明 |
---|---|
cat | 查看小型文件 |
more | 分屏查看大型文件 |
more命令
空格 显示下一屏信息
回车 显示下一行信息
b 显示上一屏信息
f 显示下一屏信息
q 退出
管道(|)命令的使用
管道(|):一个命令的输出可以通过管道做为另一个命令的输入,可以理解成是一个容器,存放在终端显示的内容。
连接命令
命令 | 说明 |
---|---|
ln -s | 创建软链接 |
ln | 创建硬链接 |
软链接:类似于Windows下的快捷方式
硬链接:类似于源文件的一个别名
注意点:
创建硬链接使用相对路径和绝对路径都可以
删除源文件,硬链接还可以访问到数据。
创建硬链接,硬链接数会加1,删除源文件或者硬链接,硬链接数会减1。
创建软链接,硬链接数不会加1
不能给目录创建硬链接
文本搜索命令!!
命令 | 说明 |
---|---|
grep | 文本搜索 |
grep命令选项的使用
命令选项 | 说明 |
---|---|
-i | 忽略大小写 |
-n | 显示匹配行号 |
-v | 显示不包含匹配文本的所有行 |
grep命令结合正则表达式的使用
正则表达式 | 说明 |
---|---|
^ | 以指定字符串开头 |
$ | 以指定字符串结尾 |
. | 匹配一个非换行符的字符 |
查找文件命令
find 指定查找目录-name “文件名”
find命令及选项的使用
命令 | 说明 |
---|---|
find | 在指定目录下查找文件(包括目录) |
find命令选项:
选项 | 说明 |
---|---|
-name | 根据文件名(包括目录名)字查找 |
find命令结合通配符的使用
通配符 | 说明 |
---|---|
* | 代表0个或多个任意字符 |
? | 代表任意一个字符 |
压缩和解压缩命令
.gz和.bz2的压缩包需要使用tar命令来压缩和解压缩
.zip的压缩包需要使用zip命令来压缩,使用unzip命令来解压缩
tar命令及选项的使用
命令 | 说明 |
---|---|
tar | 压缩和解压缩命令 |
选项 | 说明 |
---|---|
-c | 创建打包文件 |
-v | 显示打包或者解包的详细信息 |
-f | 指定文件名称, 必须放到所有选项后面 |
-z | 压缩或解压缩(.gz) |
-j | 压缩或解压缩(.bz2) |
-x | 解包 |
-C | 解压缩到指定目录 |
压缩成.gz
tar -zcvf test.tar.gz *.txt
压缩成.bz2
tar -jcvf test2.bz2 *.txt
解压缩.gz
tar -zxvf test.tar.gz
解压缩.bz2
tar -jxvf test.bz2
zip和unzip命令及选项的使用
命令 | 说明 |
---|---|
zip | 压缩成.zip格式文件 |
unzip | 解压缩.zip格式文件 |
unzip命令选项:
选项 | 说明 |
---|---|
-d | 解压缩到指定目录 |
- 压缩文件尽量使用.gz格式,因为占用空间较少
- 使用zip命令压缩的文件占用空间比较多, 当时比较通用,操作更加简单。
文件权限命令!!!
命令介绍
chmod 字母法的使用
- 角色
- 权限设置
- 权限说明
chmod 数字法的使用
获取管理员权限的相关命令
命令 | 说明 |
---|---|
sudo -s | 切换到root用户,获取管理员权限 |
sudo | 某个命令的执行需要获取管理员权限可以在执行命令前面加上sudo |
whoami | 查看当前用户 |
exit | 退出登录用户 |
who | 查看所有的登录用户 |
passwd | 修改用户密码,不指定用户默认修改当前登录用户密码 |
which | 查看命令位置 |
shutdown –h now | 立刻关机 |
reboot | 重启 |
用户相关操作
命令 | 说明 |
---|---|
useradd | 创建(添加)用户 |
-m | 自动创建用户主目录,主目录的名字就是用户名 |
-g | 指定用户所属的用户组,默认不指定会自动创建一个同名的用户组 |
命令 | 说明 |
id | 查看用户信息 |
su | 切换用户 |
userdel | 删除用户 |
用户组相关操作
命令 | 说明 |
---|---|
groupadd | 创建(添加)用户组 |
groupdel | 删除用户组 |
远程登录、远程拷贝命令
ssh 远程登录
ssh 用户名@ip地址
补充
netstat -anp|grep service_name 查看某个服务端口
ps -l 列出与本次登录有关的进程信息;
ps -aux 查询内存中进程信息;
ps -aux | grep *** 查询***进程的详细信息;
top 查看内存中进程的动态信息;
kill -9 pid 杀死进程
awk
grep擅长查找功能,sed擅长取行和替换。awk擅长取列。
awk同sed命令类似,只不过sed擅长取行,awk命令擅长取列。 awk是一个报告生成器,拥有强大的文本格式化能力。
grep适合单纯的查找或者匹配查找结果,set适合编辑匹配到的文本,而awk命令更适合格式化文本,对文本进行较为复杂的格式处理。
- awk基本语法:
awk [option] ‘pattern{action}’ file1,file2,…filen
其中action中最常用的print命令
cat awk_test.txt
cat awk_test.txt | awk '{print $1,$2}'
cat awk_test.txt | awk '{print $1,$2,$3,"dog"}'
awk '{print $1,$2}'是指打印出这个文件的第一列和第二列
awk ‘{print $0}’
收尾添加相关字符
awk的使用方法:
awk [option] ‘pattern{action}’ file1,file2,…filen
awk 'begin{print "this is awk result:"} {print $1,$2,$3,"dog"} end{print "awk end"}'
cat awk_test.txt | awk 'BEGIN{print "this is awk result:"} {print $1,$2,$3,"dog"} END{print "awk end"}'
把pattern的模式设置问BEGIN或者END的时候,它就可以在我们输出文件的时候,添加文件的首尾字符串,需要注意的是,BEGIN和END不能小写
分隔符
awk [option] ‘pattern{action}’ file1,file2,…filen
cat awk_test.txt
cat awk_test.txt | awk -F# '{print $1,$2}'
使用awk -F#的时候,awk命令就是用#作为分割符号,来分割这个文件中的内容
内置变量和自定义变量
NR 行号,当前处理文本行的行号
NF 当前行的字段的个数
FNR 个文件分别计数的行号
FILENAME 文件名称
FS 输入字段分隔符
OFS 输出字段分隔符
ARGC以及ARGV 数组以及命令行参数的个数
# FS 和 OFS 输入输出字段分隔符
FS的作用:
[root@dev01 yeyz_shell]# cat awk_test.txt
this#is#a#test##file 1
this#is#a#test##file 2
this#is#a#test##file 3
this#is#a#test##file 4
[root@dev01 yeyz_shell]# cat awk_test.txt | awk -v FS='#' '{print $2,$3}'
is a
is a
is a
is a
# FS使用-作为分隔符,对于输入的字符串进行处理。
#OFS使用-作为分隔符,输出文件中的内容:
[root@dev01 yeyz_shell]# cat awk_test2.txt
this is a shell program
this is a shell program
this is a shell program
this is a shell program
[root@dev01 yeyz_shell]# cat awk_test2.txt | awk -v OFS='-' '{print $2,$3,$4}'
is-a-shell
is-a-shell
is-a-shell
is-a-shell
# NR和NF 行数和每一行的列数
[root@dev01 yeyz_shell]# cat awk_test3.txt
this is a test program
this is a shell test program
[root@dev01 yeyz_shell]# cat awk_test3.txt | awk '{print NR,NF}'
51 5
62 6
#FNR和NR的区别
[root@dev01 yeyz_shell]# cat awk_test3.txt
this is a test program
this is a shell test program
[root@dev01 yeyz_shell]# cat awk_test4.txt
this#is#a#test#program
this#is#a#shell#test#program
[root@dev01 yeyz_shell]# awk {'print NR,$0'} awk_test3.txt awk_test4.txt
this is a test program
this is a shell test program
this#is#a#test#program
this#is#a#shell#test#program
[root@dev01 yeyz_shell]# awk {'print FNR,$0'} awk_test3.txt awk_test4.txt
this is a test program
this is a shell test program
this#is#a#test#program
this#is#a#shell#test#program
#FNR是把不同文件的行号进行了区分,而NR没有对文件的行号进行区分。
#FILENAME 显示文件名称
[root@dev01 yeyz_shell]# awk {'print FILENAME,FNR,$0'} awk_test3.txt awk_test4.txt
awk_test3.txt 1 this is a test program
awk_test3.txt 2 this is a shell test program
awk_test4.txt 1 this#is#a#test#program
awk_test4.txt 2 this#is#a#shell#test#program
# ARGC和ARGV
#其中ARGV是一个数组,数组包含下标,使用下标可以访问数组中的文件名称
[root@dev01 yeyz_shell]# awk 'BEGIN{print "aaa",ARGV[1]}' test1 test2
aaa test1
[root@dev01 yeyz_shell]# awk 'BEGIN{print "aaa",ARGV[2]}' test1 test2
aaa test2
[root@dev01 yeyz_shell]# awk 'BEGIN{print "aaa",ARGV[0],ARGV[1],ARGV[2]}' test1 test2
aaa awk test1 test2
[root@dev01 yeyz_shell]# awk 'BEGIN{print "aaa",ARGV[0],ARGV[1],ARGV[2],ARGC}' test1 test2
aaa awk test1 test2 3
#ARGV[0]指的是awk这个命令,这一点是awk命令规定的,其他的参数都是值得是后面处理的文件的名称,ARGC指的是ARGV数组的值的个数,在本例子中,它的值是3。
#自定义变量
[root@dev01 yeyz_shell]# awk -v var='yeyz' 'BEGIN{print var}'
yeyz
[root@dev01 yeyz_shell]# awk 'BEGIN{ var2="yyy" ; print var2}'
yyy
#当变量写在{}外面的时候,需要使用-v参数,当变量写在{}里面的时候,不需要写-v参数,但是需要注意的是,二者都需要写上BEGIN这个模式。
其他
awk [可选的命令行选项] 'BEGIN{命令 } pattern{ 命令 } END{ 命令 }' 文件名
打印某几列
$ echo 'I love you' | awk '{print $3 $2 $1}'
youloveI
条件过滤
awk [可选的命令行选项] 'BEGIN{命令 } pattern{ 命令 } END{ 命令 }' 文件名
$ cat score.txt
tom 60 60 60
kitty 90 95 87
jack 72 84 99
$ awk '$2>=90{print $0}' score.txt
kitty 90 95 87
判断语句
$ awk '{if($2>=90 )print $0}' score.txt
kitty 90 95 87
$ awk '{if($2>=90 )print $1,"优秀"; else print $1,"良好"}' score.txt
tom 良好
kitty 优秀
jack 良好
BEGIN 定义表头
awk [可选的命令行选项] 'BEGIN{命令 } pattern{ 命令 } END{ 命令 }' 文件名
使用方法如下:
$ awk 'BEGIN{print "姓名 语文 数学 英语"}{printf "%-8s%-5d%-5d%-5d\n",$1,$2,$3,$4}' score.txt
姓名 语文数学英语
tom 60 60 60
kitty 90 95 87
jack 72 84 99
$ awk 'BEGIN{OFMT="%.2f";print 1.2567,12E-2}'
1.26 0.12
END 添加结尾符
和BEGIN用法类似
$ echo ok | awk '{print $1}END{print "end"}'
ok
end
数据计算
$ awk 'BEGIN{print "姓名 语文 数学 英语 总成绩"; \
sum1=0;sum2=0;sum3=0;sumall=0} \
{printf "%5s%5d%5d%5d%5d\n",$1,$2,$3,$4,$2+$3+$4;\
sum1+=$2;sum2+=$3;sum3+=$4;sumall+=$2+$3+$4}\
END{printf "%5s%5d%5d%5d%5d\n","总成绩",sum1,sum2,sum3,sumall}'\
score.txt
姓名 语文 数学 英语 总成绩
tom 60 60 60 180
kitty 90 95 87 272
jack 72 84 99 255
总成绩 222 239 246 707
有用的内置变量
NF:表示当前行有多少个字段,因此$NF就代表最后一个字段
NR:表示当前处理的是第几行
FILENAME:当前文件名
OFMT:数字输出的格式,默认为%.6g。表示只打印小数点后6 位
$ awk -F ':' '{print NR ") " $1}' demo.txt
1) root
2) daemon
3) bin
4) sys
5) sync
内置函数
$ echo 1 2 | awk '{print $1+sqrt($2)}'
2.41421
$ echo 1 | awk 'BEGIN{srand()}{print rand()}'
0.929885
grep
grep擅长查找功能
递归查找所有匹配的文件内容
$ grep -rl love *
dir/file3.txt
file.txt
file2.txt
忽略大小写递归查找并带行号输出
$ grep -inr "It doesn’T" *
dir/file3.txt:38:It doesn’t matter where
file.txt:38:It doesn’t matter where
file2.txt:38:It doesn’t matter where
忽略大小写显示行号,显示匹配内容和前后2行
一般用于定位日志问题,-A 2 -B 2 也可以替换成-C 2
$ grep -in "It doesn’T" file.txt -A 2 -B 2
file.txt-36-the way that ypu change my world
file.txt-37-when I’m with you
file.txt:38:It doesn’t matter where we're from and where
查找匹配的进程名,忽略带grep的内容
$ ps -ef | grep -i wei
501 1807 1 0 25 519 ?? 5:29.55 /usr/bin/Weiyun -psn_0_176171
501 92256 1851 0 10:32 grep --color=auto
$ ps -ef | grep -i wei | grep -v grep
501 1807 1 0 25 519 ?? 5:29.55 /usr/bin/Weiyun -psn_0_176171
或逻辑查找
$ grep -E "love|change" file.txt
I love you
I love you
the way that you change my world
Love may come and love may go
正则表达式测试
echo coding3min@foxmail.com | grep -p "^[A-Za-z0-9\u4e00-\u9fa5]\+\@[a-zA-Z0-9_-]\+\(\.[a-zA-Z0-9_-]\+\)"
coding3min@foxmail.com
sed
sed命令是用来批量修改文本内容的,比如批量替换配置中的某个ip。
sed [参数] [文本或文件]
1.在某行前面插入一行
$ sed -i "1a insert after" file.txt
$ cat file.txt
1
insert after
2
3
其中1a表示在第1行后(after)插入
2.在某行后面插入一行
$ sed -i "1i insert before" file.txt
$ cat file.txt
insert before
1
2
3
其中1i表示在第1行前插入
删除
$ sed -i '2,3d' file.txt
$ cat file.txt
1
删除行可以删除一行 (3d删除第三行),也可以写一个范围(2,3d删除2-3行,闭区间),$符号代表末尾
替换行
$ sed -i '2c replace' file.txt
$ cat file.txt
1
replace
3
2c replace表示替换第2行的内容为replace
缺点是只能多次替换行,不能一次性替换全部匹配到的行,可以用正则替换(/^2/c replace代表替换所有以2开头的行为replace)
仅替换匹配的字符串
为了便于演示修改文件内容为
$ cat -n config.txt
1 name=coding3min
2 age=0
3 email=coding3min@foxmail.com
4 name=coding3min
5 age=0
6 email=coding3min@foxmail.com
使用命令批量替换3-4行之间coding3min字符串为tom
$ sed -i '3,4s/coding3min/tom/g' config.txt
$ config.txt
name=coding3min
age=0
email=tom@foxmail.com
name=tom
age=0
email=coding3min@foxmail.com
s/coding3min/top/g代表全文匹配不限制行,去掉g代表只替换匹配到的第一个如s/coding3min/top
查找与输出
输出3-4行的内容
sed -n 3,4p config.txt
email=coding3min@foxmail.com
name=coding3min
查找所有以name开头的行
sed -n '/^name/p' config.txt
name=coding3min
name=coding3min
可以看到只要用-n参数+匹配p模式就可以sj查找并输出
自动创建备份文件
直接sed -i很容易造成替换错误,所以需要事先用-n+p也就是上一节说的方法先校验下结果。所以可以用 sed -i备份文件后缀的方式例如sed -i.bak或者sed -i.backup
$ sed -i.bak 's/coding3min/kitty/g' config.txt
$ ls
config.txt config.txt.bak
$ cat config.txt
name=kitty
age=0
email=kitty@foxmail.com
$ cat config.txt.bak
name=coding3min
age=0
email=coding3min@foxmail.com
与grep的结合使用
与grep结合使用可以提前校验和批量替换,提高容错率和效率
sed -i 's/coding/kitty/g' `grep -rl coding *`
$cat config.txt
name=conding3min
age=0
email=conding3min@foxmail.com
$cat test/config.txt
name=conding3min
age=0
email=conding3min@foxmail.com
grep -rl递归找到匹配的文件,并把文件名输出,前后加上了 反引号,就是键盘左上角数字1左边那个符号,代码提前执行。然后再使用替换文件内容。
#其他技巧
使用sed把DOS格式的文件转换为Unix格式 sed 's/.$//' filename
匹配所有包含邮箱的行,(-n 选项让sed仅仅是输出经过处理之后的那些行)
sed -n '/[A-Za-z0-9]\+\@[a-zA-Z0-9_-]\+\(\.[a-zA-Z0-9_-]\+\)/p' config.txt
email=coding3min@foxmail.com
email=coding3min@foxmail.com
去掉所有的html标签
$ cat html.txt
<b>hi!</b><span>I'm</span>
$ sed 's/<[^>]*>//g' html.txt
hi!I'm father
grep,sed,awk摘自公众号【编程三分钟】,仅供个人回顾使用。