Linux 之 快捷键,命令总结 --- 三剑客**

时间:2022-05-23 16:54:11

第一部分 快捷键

ctrl+a 将光标跳转至行首
ctrl + e 将光标跳转至行末
Ctrl + w 以空格为单位,将当前光标位置之前的内容删除
.ctrl +u 将当前光标位置之前的内容全部删除
ctrl + l 清屏
ctrl + c 终止当前命令
ctrl + d 退出,断开当前连接(exit,logout)
ctrl + z 挂起,放后台执行
ctrl + r 搜索历史命令
ctrl+s 锁屏
Ctrl+q 解锁
Ctrl+左右 按照单词跳转光标
esc + . 瞬间显示出上一条命令,最后的内容,以空格分隔
Ctrl+y 将粘贴板上的内容粘贴出来,配合u,k,w使用

第二部分文件和目录操作命令

1.1 date / useradd

date 获取当前时间
useradd 创建用户

例如:

命令方式: [root@gong ~]# date #获取当前时间 

2019年 06月 14日 星期五 15:47 CST 

 

[root@gong ~]# useradd gjy 

\#增加用户名

1.2 echo 调用变量

echo 在bash shell中调用变量$
查看当前命令解释符 

[root@gong ~]# echo $ps1 

[\u@\h \w]\$ 

echo:在bash shell中调用变量 $

1.3 whoami 查看用户名

whoami 查看用户名
查看当前用户(whoamai:查看当前登录的用户) 

[root@centos7 ~]# whoamai 

root 

root:超级系统用户名,也是当前系统的用户

root之外的都是普通用户

1.4 tab命令补全

tab 命令补全,选项补全,参数补全
例如:、 [root@centos7 ~]# ifc 

\#按下tab键会自动补全,若按一下tab没反应,就需要按两下tab键,列出所有if开头的命令 

ifcfg ifcconfig 

[root@centos7 ~]# ifconfig 

[root@centos7 ~]# ls /etc/sysconfig/network-scripts/ifcfg-eth0       #网络配置名称

1.5 history 历史命令

history 列出历史命令。
-w 把历史文件写入文件
-c 清空命令历史记录,不会清空文件
-d 指定一条记录删除
-w 保存历史命令
!! 执行上一条命令
!n 执行历史命令中的第n条命令
例如:

查看历史记录: 

[root@gong ~]# history 

清空历史记录 

[root@gong ~]# history -c 


\#指定一条历史记录删除 

[root@gong ~]# history -d 23 


\#保存历史命令 

[root@gong ~]# history -w 


\#执行上一条命令

[root@gong ~]# !! 


\#执行上一条ls相关命令 

[root@gong ~]# !ls

 \#执行历史命令中的第23条命令 

[root@gong ~]# !23

1.6 alias 别名

alias 创建命令别名 alias 别名=“命令”
unalias 取消文件别名 unlias 别名
例如:定义临时别名,查看网络是否可以通,ping 百度,只对当前shell 生效

[root@gong ~]# alias tong="ping baidu.com"         #需用双引号,单引号输出的结果是引号内的字符串

PING baidu.com (123.125.114.144) 56(84) bytes of data.

64 bytes from 123.125.114.144: icmp_seq=1 ttl=128 time=44.2 ms

64 bytes from 123.125.114.144: icmp_seq=2 ttl=128 time=47.5 ms

64 bytes from 123.125.114.144: icmp_seq=3 ttl=128 time=46.3 ms

......
查看所有定义的别名

[root@gong ~]# alias

alias cp='cp -i'

alias l.='ls -d .* --color=auto'

alias ll='ls -l --color=auto'

alias ls='ls --color=auto'

alias mv='mv -i'

alias rm='rm -i'

alias tong='ping baidu.com'

......

 

取消别名

[root@gong ~]# unalias oldboy

[root@gong ~]# oldboy

-bash: tong: command not found


永久生效

[root@gong ~]# vim /etc/bashrc

alias oldboy="ping baidu.com"

1.7 ls获取命令帮助help

Ls常见选项 全拼list,功能是列出目录的内容及其内容属性信息。
-l 以长格式方式显示文件或目录的详细内容
-a 查看目录下的所有文件,包括隐藏文件
-d 只显示目录名,而不显示目录里面的内容
-F 给不同类型的文件加上不同的标记
-r 倒叙
-t 按照文件或目录的修改时间进行排序
-i 显示文件的inode 号码
-h 以人类可读的方式

获取ls命令的帮助 

[root@gong ~]# ls --help 

用法:ls[选项]...[文件]...

 

[root@gong ~]# man ls

1.8 cd:切换目录change directory

cd 切换至当前用户家目录
cd - 切换上次所在目录
cd ~ 切换至当前用户家目录
cd . 代表当前目录,一般在拷贝、移动情况下使用
cd .. 切换至当前目录的上级目录

1.9 mkdir:创建目录make directory

-m 创建目录时,指定权限(很少用,几乎不用)
-p 如果目录已存在则不会报错,递归创建
-v 打印出创建过程信息
\#创建目录

[root@gong ~]# mkdir dir1

\#创建目录并给权限

[root@gong ~]# mkdir -m777 dir2

\#递归创建目录

[root@gong ~]# mkdir -p dir3/dir4/dir5

\#创建目录并显示信息

[root@gong ~]# mkdir -pv dir4/dir5/dir6

备注:rwx为7,read 读,write写,exec执行

最高权限为777,目录一般权限为755,文件一般权限为644

 

例如:

条命令建出以下的目录:

/home/zls

/home/abc

/home/abc/1

/home/abc/2

/home/abc/3

/home/abc/1/zls

/home/abc/2/zls

/home/abc/3/zls

/usr/local/abc

/data

/backup

/backup/abc

/abc

/abc/test

/abc/test/1

...

/abc/test/10

解答:

[root@gong ~]# mkdir /{home/{zls,abc/{1..3}/zls},usr/local/abc,data,backup/abc,abc/test/{1..10}} -pv

2.0 touch创建文件

Touch

语法:touch[选项]... 文件名...

创建文件,如果文件存在,不会覆盖内容,但是会修改创建时间

Linux中,一切皆文件

示例1:

[root@gong ~]# touch file

[root@gong ~]# touch file1 file2

[root@gong ~]# touch /home/zls/file3 file4

[root@gong ~]# touch file{5,6,7}

[root@gong ~]# touch file{10..100}

 

示例2:

[root@gong ~]# touch abc

[root@gong ~]# touch  /oldboy/abc

Touch:cannot touch ‘/oldboy/abc’:no such file or directory

 

**注意:**
1.创建文件,必须要创建在一个存在的目录中
2.和创建目录不同的是,创建相同的文件不会报错
3.创建相同的文件,源文件内容不会被覆盖
4.在Linux当中一切皆文件

 

2.1 tree 树状显示目录文件结构

-l 指定层级(level)
-d 只查看目录
如果没有安装,则需要先安装:yum -y install tree

起始目录为 . 

[root@gong ~]# tree  当前目录的tree结构

[root@gong ~]# tree /   /目录下的所有文件,目录

[root@gong ~]# tree /home    /home下的文件,目录

[root@gong ~]# tree -L 1 /      /目录下的一级目录,开头不是 . ,是指定的层级

[root@gong ~]# tree -L -d 2 /usr/local    只查看/usr/local的二级目录,不看文件

2.2复制命令cp

cp 复制
-r 递归拷贝,拷贝目录,连里面的东西一并拷贝
-p 保持源文件的属性
-a 拷贝目录并保持属性,和-rp一样 (用的最多
-rp 递归拷贝并保持源文件的属性
-v 显示复制的过程
-t 交换目标和源文件的位置(意义不大)
语法:

cp [OPTION]... 源文件 目标

cp [OPTION]... SOURCE... DIRECTORY

cp [OPTION]... -t DIRECTORY SOURCE...

 

 

[root@oldboyedu ~]# cp oldboy /usr/

cp: omitting directory ‘oldboy’

 

复制文件的过程:

[root@oldboyedu ~]# cp -v 123 456 789 /opt/

‘123’ -> ‘/opt/123’

‘456’ -> ‘/opt/456’

‘789’ -> ‘/opt/789’

 

cp可以修改名字,指定的目录不存在,也可以拷贝,但拷贝即改名

 

[root@gong ~]# cp /etc/sysconfig/network-scripts/{ifcfg-eth0,eth00}

把网卡配置还是配置到这个路径下,改名 eth00

[root@gong ~]# cp /etc/sysconfig/network-scripts/ifcfg-eth0{,.bak}

把网卡配置还是配置到这个路径下,改名ifcfg-eth0.bak(加后缀)

备注:{,.bak}=ifcfg-eth0,ifcfg-eth0.bak

 

2.3 移动命令mv

mv:移动 move (系统默认操作,alias可以查看,mv=mv-i)

语法:

mv [OPTION]... 源文件 目标
 
注意:

\#系统默认操作,alias可以查看,mv=mv-i,执行命令时系统会自动询问要不要移动

\mv 就不会询问         

绝对路径执行命令:就是执行命令本身,不经过alias

命令前面加上转义符   \,也是执行命令本身,不经过alias

和cp一样
示例:

[root@gong ~]# mv file1 test1     #如果test1目录存在,file1直接放进
[root@gong ~]# touch file1       #创建文件file1
[root@gong ~]# echo 123>file 1    #输入123到file1文件中
[root@gong ~]# cat file1         #查看file1文件内容

 [root@gong ~]# touch 1.txt      #创建1.txt文件
[root@gong ~]# mv 1.txt  /opt/      #文件可以直接移动
[root@gong ~]# mkdir oldboy      #在当前目录下创建目录
[root@gong ~]# mv oldboy/ /opt/    #移动当前目录下的oldboy目录到/opt/目录下

总结:

1.如果目标是一个目录,就会把文件放入目录
2.文件,就会被覆盖

 

2.4 删除rm

rm 删除remove

语法:

-i 交互,再删除前需要确认
-r 递归删除
-f 强制删除(force)
-v 显示删除的过程
rm +文件 直接可以删除
rm+目录 不能直接删除,需加参数 rm -r
删文件就最好不加-f,    Linux中没有回收站,都是永久删除
最好给rm设置一个别名,禁止使用,再确认一下
禁止使用alias=rm - fr/

要想删除 加\   

[root@gong ~]# \rm -fr   #前面加\即可直接删除,不会询问

[root@gong ~]# rm - fr ./*     #是删除/目录下的目录,文件
[root@gong ~]# rm - fr ./  *  #中间有空格的话,也是会误操作,直接删/了

备注:

echo 'alias rm="echo '禁止使用rm'"' >> /etc/bashrc 

source /etc/bashrc 

再执行rm -fr /...

就会出现禁止使用

2.5 cat查看文件内容

cat:查看文件内容,会将文件的所有内容显示到屏幕

用法: cat[选项]...[文件]

-n 查看内容并显示行号
-A 显示文件的结束符和tab键,,一行结束和空行都加$, $代表某一行的结束,包含-T -E-V
-E 显示文件的结束符
-T 显示文件的tab键(^T)
-b 查看内容并显示行号,空行不显
> 标准输出重定向,将目标文件的内容清空,再将输出结果追加到目标文件
>> 标准输出追加重定向,将输出结果追加到目标文件的结尾,不会覆盖
示例:
[root@gong ~]# echo file1 >>123

[root@gong ~]# cat 123

file1

[root@gong ~]# cat 456

file2

[root@gong ~]# cat 123 456

file1

file2

 

[root@gong ~]# cat  >> zls.txt  << eof          #eof=end of 

eof                                            #eof也可以换成jieshu或者其他,但必须首尾一致

[root@gong ~]# cat zls.txt                     #能获取到zls.txt的内容

 

了解:tac zls.txt

把内容反过来了,按行为单位,倒着显示内容

2.6 查看命令more和less**

more分页显示文件内容

空格或f 向下翻页
b 向上翻页
/ 搜索关键字
= 显示当前光标所在行
q 退出
-N(数字) 每页显示几行
+N(数字) 从第几行开始显示

显示完文件内容,会自动退出。

[root@oldboyedu ~]# more /etc/services

不可以操作,回车是下行,空格是翻页

按q退出
    

less

[root@oldboyedu ~]# less /etc/services

/ + 关键字 会高亮显示
空格或f 向下翻页
b 向上翻页
q 退出
n 向下搜索
- N 向上搜索(shift + n) ,给显示出来的内容加上行号

显示完文件,不会自动退出,按q退出后,会缩回文件内容

2.7 查看文件前n行 head

用法:

Head + 文件名

-n: 显示前n行,n为数字,n后面加数字

默认为前10行

[root@oldboyedu ~]# head /etc/services                    #默认为前10行  

[root@oldboyedu ~]# head -n 20 /etc/services            # Head -n 20       #查看前20行

[root@oldboyedu ~]# head -20 /etc/services        #Head -20         #查看前20行

2.8查看尾部tail

用法:

tail+文件名

默认显示后10行

-f  :    追踪文件末尾,相当于tailf

Tailf=tail -f 是一个单独的命令,追踪日志

-F  :实时查看文件内容的更新,当文件不存在时,会一直的尝试

-n : 显示前n行,n为数字,n后面加数字

(n也可以不写,作用一样)
[root@centos7 ~]# tail -1 /etc/services              #显示出/etc/servicces的最后一行
matahari        49000/tcp               # Matahari Broker

3.0 find文件查找

[root@oldboyedu ~]# find  /   -type d  -name "oldboy"
/root/oldboy
[root@oldboyedu ~]# find  /root   -name "*.txt"  
/root/oldboy.txt
/root/file4.txt
/root/ip.txt
/root/file.txt
/root/file1.txt
/root/file2.txt
/root/file3.txt
[root@oldboyedu ~]# find  /root  -type  f  -name "*.txt"  
/root/oldboy.txt
/root/file4.txt
/root/ip.txt
/root/file.txt
/root/file1.txt
/root/file2.txt
/root/file3.txt

3.1.文件的上传下载

需要下载安装包
[root@oldboyedu ~]# yum install -y lrzsz    #安装包

rz:只能上传文件   (直接拖拽文件)
    1)不支持上传超过4G的文件
    2)不支持断点续传
  rz不能上传目录,需要把目录压缩打包才可以上传

      
sz:下载文件
示例:sz filename  

3.2.从外网下载文件wget

wget 文件下载
-O 指定地址下载,更改名称
-T 超时时间
-q 安静下载(关闭wget输出)
--spider 网络爬虫
示例:
Wget http://www.baidu.com
如果没有,则安装:yum install -y wget
-O:指定下载的路径,可以改名

3.3curl文件下载

-o:指定下载的路径,可以改名

示例:

Curl -o http://www.baidu.com

3.4.查找命令which

Which查找系统目录下的命令(绝对路径)
[root@centos7 ~]# which rm
alias rm='rm -i'
    /usr/bin/rm


了解
type -a 也可以查命令的路径
whereis也可以查命令的路径

[root@centos7 ~]# whereis rm
rm: /usr/bin/rm /usr/share/man/man1/rm.1.gz
[root@centos7 ~]# type -a rm
rm is aliased to `rm -i'
rm is /usr/bin/rm

[root@oldboyedu ~]# type -a ls
ls is aliased to `ls --color=auto'
ls is /usr/bin/ls
[root@oldboyedu ~]# type -a for
for is a shell keyword

3.5.字符处理命令-排序sort

-t 指定分隔符
-k 指定第几列的内容(按分隔符),不指定分隔符,默认是空格为分隔符
-n 按照阿拉伯数字的大小顺序排序
-r 倒叙排序
输入文件

[root@centos7 ~]# cat >> sort.txt <<eof
\> A:d:8
\> E:x:2
\> B:c:6
\> eof  

 
排序文件
[root@centos7 ~]# sort sort.txt
A:d:8
B:c:6
E:x:2   

按照字母小写顺序排序
[root@centos7 ~]# sort -t ':' -k 2 sort.txt
B:c:6
A:d:8
E:x:2 

按照字母小写顺序排序
[root@centos7 ~]# sort -t ':' -k 2 -n sort.txt
A:d:8
B:c:6
E:x:2

按照字母小写倒叙
[root@centos7 ~]# sort -t ':' -k 2 -n -r sort.txt
E:x:2
B:c:6
A:d:8

3.6.字符处理-去重uniq

去重相邻行,不相邻不会去重

-c 显示去重后的数量(count)
-d 只显示重复的行
-u 只显示不重复的行
输入内容:
[root@centos7 ~]# cat >>unip.txt <<eof
\> abc
\> abc
\> 123
\> eof 

文件去重(没有排序无法去重)
[root@centos7 ~]# uniq uniq.txt
abc
123
abc
123

排序文件
[root@centos7 ~]# sort uniq.txt
123
123
abc
Abc

先排序文件,后去重
[root@centos7 ~]# sort uniq.txt |uniq
123
abc  

先排序文件,后去重并显示去重后的数量
[root@centos7 ~]# sort uniq.txt |uniq -c
2 123
2 abc

3.7.字符处理-截取cut

-d 指定分隔符
-f 指定第几列
-c 根据字符来取数据
输入内容
[root@centos7 ~]# cat >>info.txt <<eof
\> I’m gjy,20 years old qq 861962063 
\> eof 

\#以空格为分隔符,截取第二个,第六个字符
[root@centos7 ~]# cut -d ' ' -f 2,6 info.txt
gjy,20 861962063    

以空格为分隔符,截取第二个,第六个,再以逗号为分隔符,截取第一个第二个
[root@centos7 ~]# cut -d ' ' -f 2,6 info.txt |cut -d ',' -f 1,2
gjy,20 861962063    


[root@centos7 ~]# cut -d ' ' -f 2,6 info.txt |cut -c 1-3,8-16
gjy861962063

3.8.字符处理-统计wc

-l 统计行数
-c 统计字节数
-w 统计单词次数,也就是列数
示例:
[root@centos7 ~]# wc /etc/services
 11176  61033 670293 /etc/services 

统计字节:
[root@centos7 ~]# wc -c /etc/services
670293 /etc/services    l

统计行数
[root@centos7 ~]# wc -l /etc/services
11176 /etc/services

统计列数
[root@centos7 ~]# wc -l /etc/services
11176 /etc/services

 

3.9.tr替换

[root@centos7 ~]# tr '1' 'o' <uniq.txt           #1就全部替换成了o
abc
o23
abc
o23
[root@centos7 ~]# echo "1" >>uniq.txt       #再追加一个 1
[root@centos7 ~]# tr '123' '0ld' <uniq.txt     #单个对单个的替换
abc
0ld
abc
0ld
0

命令之三剑客

1. grep

grep 过滤关键字
-n 显示行号
-o 只显示关键字,不显示行号 和其他内容
-B 显示前n行,n为数字(before)
-A 显示关键字的后n行,n为数字(affer)
-C 显示关键字的前后n行,n为数字(center)相当于 -B-A ( -B 1 -A1=-C1显示关键字的前后1行)
-v 取反
-w 只匹配关键字(一整串的字符串)
-r / -R 递归过滤
-E 支持多关键字,中间用|分隔 grep -E=egrep
-i 不区分大小写,忽略大小写
^ 以什么开头 ‘^root’
$ 以什么结尾 ‘root\(’ | | ^\)
^[a-z] 以a到z开头的
. 代表字符
* 代表所有
| 管道符,将前面命令输出的结果交给后个 ,grep A passwd | grep -v ‘^tss’

-w 匹配字符串

[root@oldboyedu ~]# grep -w 'root'  passwd

-c选项 统计行

#含root字符串的行
[root@oldboyedu ~]# grep -c 'root' passwd 
#所有的行
[root@oldboyedu ~]# grep -c '.' passwd 

-R / -r 结果一样,递归过滤,能过滤指定目录下所有文件

[root@oldboyedu ~]# grep -R 'root'  ./
[root@oldboyedu ~]# grep -r 'root'  ./

过滤出以11为开头的行

[root@oldboyedu ~]# grep -n '.' passwd |grep  -w '^11'

-A 往下数n行,

#过滤出以11为开头的行,往下9行
[root@oldboyedu ~]# grep -n '.' passwd |grep  -wA9  '^11'
    
#-B选项  往上数n行
#过滤出以11为开头的行,往上数9行所有行
[root@oldboyedu ~]# grep -n '.' passwd  |grep -wB 9  '^11' 

#-C选项  往上下同时数n 行
#过滤出以11为开头的行,往上数9行并且往下数9行所有行
[root@oldboyedu ~]# grep  -n '.' passwd  |grep -EwC9 '^11'

#过滤出以15,16为开头的行,往上数4行并且往下数4行所有行
[root@oldboyedu ~]# grep  -n '.' /etc/passwd  |grep -EwC4  '^1[56]'

正则:

^以什么开头
[root@oldboyedu ~]# grep '^r' passwd 

$以什么结尾
[root@oldboyedu ~]# grep  'h$' passwd 

#过滤空行,不含tab键的空行
[root@oldboyedu ~]# grep -n '^$' passwd
#过滤空行,含tab键
[root@oldboyedu ~]# grep -n '^\s*$' passwd 

#.点匹配任意一个字符
[root@oldboyedu ~]# grep '.' test.log 
[root@oldboyedu ~]# grep -o '.' test.log 
#\  转义,取消特殊字符的特殊含义。
#只过滤以点为结尾的行

[root@oldboyedu ~]# grep  '\.$'  oldboy.txt


#以m或者n开头的行
#[]表示多个字符串,会单个匹配[]里面的内容,[] [^] 的区别
#| 或者


#过滤出以m和n 为开头的行
[root@gjy ~]# grep -n '^[mn]'  oldboy.txt
[root@gjy ~]# grep -n '^m|^n' oldboy.txt -E

#过滤出不以m和n 为开头的行
[root@gjy ~]# grep -nv '^[mn]'  oldboy.txt
[root@gjy ~]# grep -n '^[^mn]' oldboy.txt

#过滤出mn 之外的其他字符所在行
[root@gjy ~]# grep -n '[^mn]' oldboy.txt

#*前面一个字符出现0次或0次以上
[root@oldboyedu ~]# grep -o '0' oldboy.txt 
[root@oldboyedu ~]# grep -o '0*' oldboy.txt 

#.*  表示所有的意思
[root@oldboyedu ~]# grep -o  '.*' oldboy.txt 
#取出文件中前17位在0-9之间
[root@gjy ~]# grep -En '[0-9]{17}' id.txt
#取出文件中前17位在0-9之间,后一位在0-9;a-X之间
[root@gjy ~]# grep -Eon '[0-9]{17}[0-9X]{1}' id.txt
#取出文件中前17位在0-8之间
[root@gjy ~]# grep -En '[0-8]{17}' id.txt

清理nginx配置文件

[root@oldboyedu ~]# grep -Ev  '^\s*$|#' /etc/nginx/nginx.conf.default  >nginx.conf
#查看配置文件
[root@oldboyedu ~]# grep  '^[a-Z]'  /etc/ssh/sshd_config

[root@oldboyedu ~]# grep -Ev  '^$|#' /etc/ssh/sshd_config

2. sed 文本处理工具,三剑客之一

选项:

-n 取消默认输出
p 打印当前内容
取反
-i.bak 先备份,再替换
d 删除当前行
-i 替换,修改原文件的内容
i 插入文件内容
$ 以什么结尾的行
a 追加
s 替换
g 表示全局
多条命令分隔符,取不连续的多行
-r 支持扩展正则表达式使用

取行

#取单行
[root@oldboyedu ~]# sed  -n  '3p' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
#取连续的多行(取第5到第10行)
[root@oldboyedu ~]# sed -n '5,10p' passwd

#取不连续的多行(取第5行和第10行)  
[root@oldboyedu ~]# sed -n '5p;10p' passwd

#删除单行
[root@oldboyedu ~]# sed  '2d'  passwd 
#删除连续的多行
[root@oldboyedu ~]# sed '2,10d' passwd
#删除不连续的多行
[root@oldboyedu ~]# sed '2d;10d' passwd
#排除,取反
[root@oldboyedu ~]# sed  '2!p' passwd

#过滤字符串
[root@oldboyedu ~]# sed -n  '/yy/p'  sed.txt
104,$yy,CFO

#过滤多个(过滤含有oldboy和yy的行)
[root@oldboyedu ~]# sed -n '/oldboy/p ; /yy/p' sed.txt
[root@oldboyedu ~]# sed -nr '/oldboy|yy/p'  sed.txt

#过滤多个连续的字符串
[root@oldboyedu ~]# sed -n '/oldboy/,/yy/p' sed.txt

#在第三行后面追加内容
[root@oldboyedu ~]# sed '3aoldboy' sed.txt
101,$oldboy,CEO
102,$zhangyao,CTO
103,$Alex,COO
oldboy
104,$yy,CFO
105,$feixue,CIO

#在第四行的上面插入内容
[root@oldboyedu ~]# sed '4ioldboy'  sed.txt

#插入多行内容
[root@oldboyedu ~]# sed '4ioldboy\noldgirl'  sed.txt

#追加多行内容
[root@oldboyedu ~]# sed '3aoldboy\noldgirl'  sed.txt

#在结尾追加内容
[root@oldboyedu ~]# sed  '$aoldboy'  sed.txt

改文件,替换

#全局
[root@oldboyedu ~]# sed 's#oldboy#jinke#g'  sed.txt

[root@oldboyedu ~]# sed -i.org  's#oldboy#jinke#g'  sed.txt

#c  原位置替换
[root@oldboyedu ~]# sed  '/^SELINUX=/c SELINUX=enforcing' /etc/sysconfig/selinux

#第一行到第五行的root替换 
[root@oldboyedu ~]# sed '1,5s#root#oldboy#g' passwd

#替换第一行的root
[root@oldboyedu ~]# sed '1s#root#oldboy#g' passwd

#替换特殊字符使用转义
[root@oldboyedu ~]# sed 's#$#%#g' sed.txt
101,$jinke,CEO%
102,$zhangyao,CTO%
103,$Alex,COO%
104,$yy,CFO%
105,$feixue,CIO%
[root@oldboyedu ~]# sed 's#\$#%#g' sed.txt
101,%jinke,CEO
102,%zhangyao,CTO
103,%Alex,COO
104,%yy,CFO
105,%feixue,CIO

[root@oldboyedu ~]# sed 's/\/sbin\/nologin/oldboy/g' passwd

#后向引用
[root@oldboyedu ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:1d:ca:3a brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.150/24 brd 10.0.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::80b2:dc89:7adf:c7b1/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@oldboyedu ~]# ip a s eth0 | sed -n '3p'
    inet 10.0.0.150/24 brd 10.0.0.255 scope global noprefixroute eth0
[root@oldboyedu ~]# ip a s eth0 | sed -n '3p' |sed -r  's#.*t (.*)/.*#\1#g'
10.0.0.150
[root@oldboyedu ~]# ip a s eth0 |sed -nr  '3s#.*t (.*)/.*#\1#gp'
10.0.0.150

[root@oldboyedu ~]# ifconfig  eth0 |sed -n  '2p'
        inet 10.0.0.150  netmask 255.255.255.0  broadcast 10.0.0.255
[root@oldboyedu ~]# ifconfig  eth0 |sed -nr  '2s#.*t (.*)#\1#gp'
10.0.0.255
[root@oldboyedu ~]# ifconfig  eth0 |sed -nr  '2s#.*t (.*)  n.*#\1#gp'
10.0.0.150

cat>/root/hostname_ip.sh<<"EOF"
#!/usr/bin/sh
source /etc/init.d/functions
if [ $# -ne 2 ];then
  echo "/bin/sh $0 hostname PartIP"
  exit 1
fi
hostnamectl  set-hostname   $1
if [ $? -eq 0 ];then
    action "hostname update Successful!" /bin/true
else
    action "hostname update Failed!" /bin/false
fi
Ip=$(ip a s eth0 |awk -F '[./]' 'NR==3{print $4}')
sed -i "s#$Ip#$2#g" /etc/sysconfig/network-scripts/ifcfg-eth[01]
if [ $? -eq 0 ];then
    action "IP update Successful!" /bin/true
else
    action "IP update Failed!" /bin/false
fi
systemctl  restart  network
bash
EOF

3. awk 去列,统计,计算。

选项:

取反 ’!/ /'
NR 取行'{print $0,NR}'
$ 取列 '{print ,NR}'
d 删除 '/ /d'
$NF 最后一列
$0 整行内容
print 显示内容
取反
-F FS 输入分隔符,默认是空格
-v 配合输出分隔符使用
OFS 输出分隔符
BEGIN END 数组使用
column-t 对齐
$ 完整内容
i++ 计算次数
i=i+$N 计算和

取行


[root@oldboy ~]# awk  'NR==3'  sed.txt
103,$Alex,COO
[root@oldboy ~]# awk  'NR==1,NR==3'  sed.txt
101,$jinke,CEO
102,$zhangyao,CTO
103,$Alex,COO
[root@oldboy ~]# awk 'NR==1;NR==3'  sed.txt
101,$jinke,CEO
103,$Alex,COO
[root@oldboy ~]# awk  'NR>1 && NR<3'  sed.txt
102,$zhangyao,CTO
[root@oldboy ~]# awk  'NR>=1 && NR<=3'  sed.txt
101,$jinke,CEO
102,$zhangyao,CTO
103,$Alex,COO

过滤

#过滤 

[root@oldboy ~]# awk  '/jinke/' sed.txt
101,$jinke,CEO
[root@oldboy ~]# awk  '!/jinke/' sed.txt
102,$zhangyao,CTO
103,$Alex,COO
104,$yy,CFO
105,$feixue,CIO
[root@oldboy ~]# awk '/jinke|yy/' sed.txt
101,$jinke,CEO
104,$yy,CFO
[root@oldboy ~]# awk '/jinke/;/yy/' sed.txt
101,$jinke,CEO
104,$yy,CFO
[root@oldboy ~]# awk '/jinke/,/yy/' sed.txt
101,$jinke,CEO
102,$zhangyao,CTO
103,$Alex,COO
104,$yy,CFO

取列

#取列  
#环境准备  
cat >>reg.txt<<EOF
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
EOF

#根据列进行匹配

#第三列以3开头的行
[root@oldboy ~]# awk '$3~/^3/' reg.txt
Zhang Xiaoyu 390320151 :155:90:201
Wang Xiaoai 3515064655 :50:95:135

#取反
[root@oldboy ~]# awk '$3!~/^3/' reg.txt
Zhang Dandan 41117397 :250:100:175
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175

#第三列以1或5为结尾的行
[root@oldboy ~]# awk '$3~/[15]$/' reg.txt
Zhang Xiaoyu 390320151 :155:90:201
Wu Waiwai 70271111 :250:80:75
Wang Xiaoai 3515064655 :50:95:135
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175

#显示姓zhang的人第二次的捐款金额
[root@oldboy ~]# awk  -F '[ :]' '/^Zhang/{print $1,$2,$6}'  reg.txt
Zhang Dandan 100
Zhang Xiaoyu 90

数组

显示Xiaoyu的捐款.每个值时都有以$开头.如$520$200$135
[root@oldboy ~]# awk  '/Xiaoyu/{print $4}' reg.txt  |tr ':'  '$'
$155$90$201

[root@oldboy ~]# awk  '/Xiaoyu/{print $4}' reg.txt  |sed 's#:#$#g'
$155$90$201

[root@oldboy ~]# awk  '/Xiaoyu/{print $4}' reg.txt  |sed 's#:#\$#g'
$155$90$201

[root@oldboy ~]# awk -F  '[ :]'  '/Xiaoyu/{print "$"$5"$"$6"$"$7}' reg.txt 
$155$90$201

[root@oldboy ~]# awk -F '[ :]' -vOFS='$'  '/Xiaoyu/{print "$"$5,$6,$7}' reg.txt
$155$90$201

显示所有人的全名,以姓,名的格式显示,如Meng,Feixue
[root@oldboy ~]# awk   '{print $1","$2}'  reg.txt 
Zhang,Dandan
Zhang,Xiaoyu
Meng,Feixue
Wu,Waiwai
Liu,Bingbing
Wang,Xiaoai
Zi,Gege
Li,Youjiu
Lao,Nanhai
[root@oldboy ~]# awk -vOFS=','  '{print $1,$2}' reg.txt
Zhang,Dandan
Zhang,Xiaoyu
Meng,Feixue
Wu,Waiwai
Liu,Bingbing
Wang,Xiaoai
Zi,Gege
Li,Youjiu
Lao,Nanhai

[root@oldboy ~]# awk   '{print $1,$2}'  reg.txt  |tr ' ' ','
Zhang,Dandan
Zhang,Xiaoyu
Meng,Feixue
Wu,Waiwai
Liu,Bingbing
Wang,Xiaoai
Zi,Gege
Li,Youjiu
Lao,Nanhai

#取ip地址 
[root@oldboy ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.150  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::80b2:dc89:7adf:c7b1  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:1d:ca:3a  txqueuelen 1000  (Ethernet)
        RX packets 25397  bytes 2315305 (2.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 19057  bytes 2801352 (2.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@oldboy ~]# ifconfig eth0 |awk 'NR==2{print $2}'
10.0.0.150
[root@oldboy ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:1d:ca:3a brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.150/24 brd 10.0.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::80b2:dc89:7adf:c7b1/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@oldboy ~]# ip a s eth0 |awk -F '[ /]*'  'NR==3{print $3}'
10.0.0.150

#排除空行 
[root@oldboy ~]# awk  '!/^[ \t]*$/'  file1
lhlgsd
fdssgdgs
gsdgd
[root@oldboy ~]# awk  '!/^\s*$/'  file1
lhlgsd
fdssgdgs
gsdgd

[root@oldboy ~]# awk '/^r/'  passwd 
root:x:0:0:root:/root:/bin/bash
redis:x:997:995:Redis Database Server:/var/lib/redis:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
roott
[root@oldboy ~]# awk '/h$/'  passwd 
root:x:0:0:root:/root:/bin/bash



#计算 
[root@oldboy ~]# cat test.log
10 20
[root@oldboy ~]# awk '{print $2/$1}' test.log
2
[root@oldboy ~]# awk '{print $2+$1}' test.log
30
[root@oldboy ~]# awk '{print $2-$1}' test.log
10
[root@oldboy ~]# awk '{print $2*$1}' test.log
200
[root@oldboy ~]# awk '{print $2^$1}' test.log
10240000000000
[root@oldboy ~]# awk  'BEGIN{print  10-10 }'
0
[root@oldboy ~]# awk  'BEGIN{print  10+10 }'
20
[root@oldboy ~]# awk  'BEGIN{print  10/10 }'
1
[root@oldboy ~]# awk  'BEGIN{print  10*10 }'
100
[root@oldboy ~]# awk  'BEGIN{print  10^10 }'
10000000000

#计算内存可用的百分比
[root@oldboy ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1980         148        1526           9         305        1646
Swap:          2047           0        2047
[root@oldboy ~]# free -m |awk '/^Mem/'
Mem:           1980         148        1526           9         305        1646
[root@oldboy ~]# free -m |awk '/^Mem/{print $4/$2}'
0.770707
[root@oldboy ~]# free -m |awk '/^Mem/{print $4/$2*100}'
77.0707
[root@oldboy ~]# free -m |awk '/^Mem/{print $4/$2*100"%"}'
77.0707%