一.前言
前面都已经把linux基础脉络都讲完了,而今天要说的是稍微进阶的,大家还是做个了解就行,有个大概印象,遇到要用的时候能够知道就可以了,看似很多,其实还是很少的。
二.linux特殊符号
2.1 #号
#号:注释、备注、批注,系统自动忽略,不执行。
root@localhost \~# sdddddddddddddddddddddddddddddddddddddddd
-bash: sdddddddddddddddddddddddddddddddddddddddd: 未找到命令
root@localhost \~#
root@localhost \~# # sdddddddddddddddddddddddddddddddddddddddd # 这就不报错了,因 为系统不执行被#号注释的内容
在linux系统上的指令和配置是通过#号注释的,而开发中,编程语言里面不同的语言也有不同的注释号, 比如//、'''注释内容'''、#、/**/等等
2.2 shell命令中的其他符号
1、 ;命令的分隔符,通过它可以连接多条指令,一起执行
例子:
root@localhost \~# touch 111.txt;chmod 777 111.txt
root@localhost \~# ll 111.txt
-rwxrwxrwx 1 root root 0 9月 12 04:40 111.txt
2、 ..代表上级目录
例子:
root@localhost \~# pwd
/root
root@localhost \~# cd ..
root@localhost /# pwd
/
cd ../../../../../../../../,当..很多时,就会到根目录/
3、 .代表当前目录
例子:
root@localhost opt# cp /data/man_db.conf .
root@localhost opt# ls
man_db.conf
4、变量和常量
变量,值是不固定的,比如:我的女朋友=xxx,这个xxx不是固定的。我的女朋友就是变量。别人记不住 你对象名字的时候,就这么问,你对象呢?而不是直呼其名。
常量,值是固定。圆周率=3.1415926...,固定的值,不会变。
env命令可以查看系统内置的环境变量:和windows的环境变量类似。系统变量就是让一些在调用的时候 比较麻烦或者说寻找的时候路径比较长的功能变得简单化。系统内部处理时,会根据变量的值做出不同的反 应。
root@localhost \~# env
XDG_SESSION_ID=1
HOSTNAME=localhost.localdomain # 变量作用:比如HOSTNAME这个变量,它的值比较长, 系统内部程序会经常用到这个值,那么用一个变量存放,以后想用这个值,就用这个变量即可,简单很多,而 且只要修改了这个值,其他使用这个变量的地方,值都会跟着变化,方便修改。
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000 # 这就是为什么历史命令只记录1000的原因。
SSH_CLIENT=192.168.61.1 50670 22
SSH_TTY=/dev/pts/0
USER=root # 当前登录用户,其他用户登录的时候,这个变量对应的值就变为了其他用户名
...
LANG=zh_CN.UTF-8 # language的简写,装系统的时候,你安装的英文,这里就是en_US,中文就是zh_CN
...
查看某个变量的值 $符号+变量名称:
root@localhost \~# echo $LANG
zh_CN.UTF-8
我们改一下语言变量,来看看效果,比如之前命令的参数介绍都是中文的,export用来声明环境 变量、修改环境变量等,如下:
root@localhost \~# usermod --help
用法:usermod 选项 登录
选项:
-c, --comment 注释 GECOS 字段的新值
-d, --home HOME_DIR 用户的新主目录
...
root@localhost \~# export LANG=en_US.UTF-8
root@localhost \~# usermod --help # 全部变英文了
Usage: usermod options LOGIN
Options:
-c, --comment COMMENT new value of the GECOS field
-d, --home HOME_DIR new home directory for the user account
...
也就是说,改动环境变量,会对系统有影响,因为系统中使用这个变量的功能都会随着变量的值 而做不同的处理。
5、 ""双引号,换行,解析变量
比如:echo,本来只能输出单行文本内容,加上双引号支持换行输入和输出
root@localhost \~# echo hello
hello
root@localhost \~# echo "hello
> jaden
> "
hello
jaden
root@localhost \~# echo "hello
jaden
" > jaden.txt # 还可以输出到某个文件中
root@localhost \~# cat jaden.txt
hello
jaden
有时候比vi用起来方便。
""能够解析变量,如下
root@localhost \~# echo "$LANG"
en_US.UTF-8
6、 ''单引号,换行,不解析变量
单引号不能解析变量,其他功能和双引号类似,如下
root@localhost \~# echo '$LANG'
$LANG
7、\和/ #这些我们都说过
\ 转义符,反斜杠
/ 路径分隔符
8、! 历史命令调用,在find命令中是取反的意思。
root@localhost \~# history
root@localhost \~# !47 # 历史指令序号
9、* 通配符,我们将find的之后用到过,可以匹配任意字符
root@localhost \~# ls *.txt # 查看所有.txt结尾的文件
jaden.txt
10、$ 调用变量
例子1:
root@localhost \~# export LANG='en_US.UTF-8'
root@localhost \~# echo $LANG
en_US.UTF-8
root@localhost \~# stat 111.txt
File: '111.txt'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 33575641 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-09-12 04:40:28.399177386 +0800
Modify: 2021-09-12 04:40:28.399177386 +0800
Change: 2021-09-12 04:40:28.400260737 +0800
Birth: -
root@localhost \~# export LANG='zh_CN.UTF-8'
root@localhost \~# stat 111.txt
文件:"111.txt"
大小:0 块:0 IO 块:4096 普通空文件
设备:fd00h/64768d Inode:33575641 硬链接:1
权限:(0777/-rwxrwxrwx) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2021-09-12 04:40:28.399177386 +0800
最近更改:2021-09-12 04:40:28.399177386 +0800
最近改动:2021-09-12 04:40:28.400260737 +0800
创建时间:-
还有很多指令的帮助信息即便设置了中文,它的帮助信息都是英文,比如curl root@localhost \~# curl --help
因为汉化这个事情,是好多人做的,而且要做很久,但是系统还会更新,还没汉化完,就又更新系统 了,还需重新汉化,所以这样不划算,汉化组就解散了,所以有些指令就不汉化了。而且有时候汉化出来的意 思和英语本来的意思不同,因为参与汉化的人有些不是计算机专业的,这就很尴尬。
使用变量的时候要小心,比如有些人操作变量的时候,删除了根目录,如下
root@localhost \~# jaden=/tmp # 定义变量
root@localhost \~# echo $jaden # 查看变量值
/tmp
root@localhost \~# rm -rf $jaden/* # 利用变量做删除,这是删除/tmp目录下的所有内容
!!!但是,如果变量名写错了,如下
root@localhost \~# rm -rf $jadn/* # 少写了个e字母,系统做删除的时候,找不到这个变 量,那么会变成如下效果[
root@localhost ~]# rm -rf /* # 就删除根目录了!!!!!系统崩溃了就。所以看到删除命 令,就一定要特别的小心。
11、> 输出重定向、>>追加输出重定向、< 输入重新定向、<<追加输入重定向
12、| 管道
13、||
#第一个命令失败,才执行第二个命令,第一个指令成功了,不会执行第二个指令
#指令连接符号,之前说过; 除了它,还有 || 和 &&,分号是两个指令都会执行,哪个出错都不影响 其他的指令。
root@localhost \~# echo 123 || ls
123
root@localhost \~# ech 123 || ls
-bash: ech: command not found
anaconda-ks.cfg jaden.txt
14、&&
和,两个一起执行,如果第一个失败了,两个都不执行,如果第一个成功了,第二个失败了,就执行第 一个,如果两个都成功了,就都执行。
root@localhost \~# echo 123 && ls
123
anaconda-ks.cfg jaden.txt
root@localhost \~# ech 123 && ls
-bash: ech: command not found
root@localhost \~# echo 123 && lx
123
-bash: lx: command not found
15、&
后台运行
比如top指令,之前运行top,会占住终端,除非结束top,不然不能执行其他指令
root@localhost \~# top &
1 16567
root@localhost \~# ps -ef |grep top
root 16567 1467 0 16:56 pts/0 00:00:00 top
root 16569 1467 0 16:57 pts/0 00:00:00 grep --color=auto top
16、~ 代表家目录,不同的用户家目录不同。
root@localhost \~# cd /tmp/
root@localhost tmp# cd ~
root@localhost \~# cd /tmp
root@localhost tmp# cd # 其实cd什么参数都不加,也是回到家目录
root@localhost \~#
7、` 反引号(Esc 下边的按钮)`
用来嵌套命令,反引号中的命令先执行
例子1:
root@localhost \~# mkdir `echo jaden`
root@localhost \~# ls
anaconda-ks.cfg jaden jaden.txt
例子2:[
root@localhost opt]# touch test_`date +%T`.txt
root@localhost opt# ls test_04\:56\:22.txt
test_04:56:22.txt
例子3:
root@localhost \~# tar zcf /tmp/etc.tar.gz `find /etc -type f -name "*.conf"`
tar: Removing leading `/' from member names
root@localhost \~# ls /tmp/
etc.tar.gz
root@localhost \~# tar tf /tmp/etc.tar.gz # 查看压缩包里面的文件内容
关于特殊符号,我们就说这么多。
三.正则表达式
1.什么是正则表达式?
简单的说,正则表达式就是一套处理大量的字符串而定义的规则和方法。
例如:假设 @代表1234 北京邮电大学--by
通过正则表达式这些特殊符号,我们可以快速的过滤、替换需要的内容。
linux正则一般以行为单位处理的。
2.正则表达式
准备示例:root@localhost \~# head -100 /etc/services > test.txt
- ^ 表示搜索以什么开头。
root@localhost \~# grep '^#' test.txt # 找出开头为#号的的行数据[
root@localhost ~]# grep -v '^#' test.txt # 找出开头不是#号的行数据
- $ 表示搜索以什么结尾。
root@localhost \~# grep 'ol$' test.txt # 找出结尾为ol字母的行数据
- ^$ 表示空行,不是空格。
root@localhost \~# grep '^$' test.txt # 找出所有的空白行。
root@localhost \~# grep -v '^$' test.txt # 找出所有的非空白行数据,如果保存一下, 那么相当于快速删除所有空行。
sed删除空行,更容易,因为它更擅长修改文件内容
root@localhost \~# sed '/^$/d' test.txt # 加上-i就改了原文件
- . 代表且只能代表任意一个字符。跟癞子斗地主中的癞子一样。
root@localhost \~# grep '.dp' test.txt # 找出xdp,x可以是任意一个字符,注意,是一 个!
- \ 转义字符,让有着特殊身份意义的字符,脱掉马甲,还原原型。
例如:\.只表示小数点,还原原始小数点的意义。
root@localhost \~# grep '\.ia' test.txt # 这就表示,找到含有.dp的行数据
- * 重复0个或多个前面的一个字符。不代表所有了。
准备一个测试数据:
root@localhost \~# vi num.txt
root@localhost \~# cat num.txt
a 12222
b 12222222
c 1
b 3
d 122222222222222
e 12
a 4
看下面几个的效果就知道*的意思了。
root@localhost \~# grep '2' num.txt
root@localhost \~# grep '22' num.txt
root@localhost \~# grep -o '22' num.txt # -o就能看出来,它是两个字符两个字符的匹 配
root@localhost \~# grep '12' num.txt 、
root@localhost \~# grep '12*' num.txt
root@localhost \~# grep '.*' num.txt # 匹配所有字符
root@localhost \~# grep '12.*' num.txt
- .* 匹配所有的字符。^.* 任意多个字符开头。
root@localhost \~# grep '12.*' num.txt
小任务:
1.复制一份/etc/services的前100行数据到serv文件中,然后将去掉serv文件中所有含有#的行和空行
root@localhost \~# head -100 /etc/services > serv
用sed来玩:
root@localhost \~# sed '/#/d' serv # 去掉含有#号的行
root@localhost \~# sed '/^$/d' serv # 去掉所有空行
用grep来玩:
root@localhost \~# grep -Ev '^$|#' serv > ss.txt
root@localhost \~# cat ss.txt
2. 去掉aaa.txt文件中所有的空行和注释(注意:一行中可能只有部分是注释) root@localhost \~# cat aaa.txt
hello -a #a表示友好
hello -b #b表示不友好
hello -c #c表示骂人
哈哈,这是个啥
what?
hello -d #d表示非常爱你
root@localhost \~# grep '#.*' aaa.txt # 这么写,可以将所有#号注释的内容全部匹配到,所 以这个正则表达式可以用
root@localhost \~# sed -i 's/#.*//g' aaa.txt # 将#.*匹配到的内容全部替换为空。
root@localhost \~# sed -i '/^$/d' aaa.txt # 再去除空行
root@localhost \~# cat aaa.txt # 结果就ok了。
hello -a
hello -b
hello -c
hello -d
- abc 匹配字符集合内任意一个字符a-z、0-9、A-Z,多选一,0,9这个是2选1. root@localhost \~# grep -E '0-9' serv
root@localhost \~# grep -E '0,9' serv
- \^abc ^在中括号里面表示非,不包含a或b或c。
root@localhost \~# grep -E '\^0-9*' serv # 不要数字
root@localhost \~# grep -E '\^a-z' serv # 不要小写字母
root@localhost \~# grep -E '\^a-z0-9A-Z' serv # 不要字母和数字
- {n,m} 重复n到m次,前一个字符。
#匹配一下ip地址:0.0.0.0 -- 255.255.255.255,这是ip地址的范围,个数上就是7-15个
root@localhost \~# grep -Eo '0-9.{7,15}' /var/log/secure # 但是如果有个大于7位的数字,也会被匹配上8888888
root@localhost \~# grep -Eo '0-9.{7,15}' /var/log/secure|grep '\.'
11) + 重复1次到多次,和*不同
root@localhost \~# grep -E '19*' serv
root@localhost \~# grep -E '19+' serv
12) ? 重复0次到多次,和*号很像。
root@localhost \~# grep -Eo '0-9?' serv
13)\d 和0-9是一样的,但是它属于perl正则,grep使用perl正则的时候需要用-P参数来指定
root@localhost \~# grep -E '\d' 22.txt
root@localhost \~# grep -P '\d' 22.txt
取ip的例子:
前面我们grep -Eo '0-9.{7,15}' /var/log/secure,找ip不是很准确,因为如果有个大于7位的 数字,也会被匹配上
ip addr|grep -Eo '0-9{1,3}\.0-9{1,3}\.0-9{1,3}\.0-9{1,3}'
grep 'Failed password' secure |grep -Eo '0-9{1,3}\.0-9.+'
取root用户登录时间
lastlog|sed -n '/root/p'|grep -Eo '0-9{2}:0-9{2}:0-9{2}'
关于正则,我们简单学习这么多即可,不要深究昂,因为正则的东西太多了,后面遇到了复杂的我们在 分析。
perl正则:https://www.runoob.com/perl/perl-regular-expressions.html
当然上面的三剑客还没有说,下面会说的
四.linux三剑客
三剑客就是三个强大的命令。后期讲应急溯源的时候会用到。grep用的最多,所以我们重点讲解这个指 令。三剑客配合正则表达式可以发挥很牛的作用。
4.1 grep
#擅长过滤,或者说查找,按行来过滤
例子:/var/log/secure是记录用户登录系统的行为的,登录成功还是失败,系统都会自动记录这次登录动作。
root@localhost \~# grep 'Failed password' /var/log/secure
Mar 25 18:20:48 localhost sshd16905: Failed password for root from
192.168.61.1 port 55577 ssh2
...
如果我们想将所有登录失败的ip地址找出来,可以再次过滤
比如查看某个ip地址登录了多少次root@localhost \~# grep 'Failed password' /var/log/secure|grep
'192.168.61.1'|wc -l
3
可以借助正则表达式来进行过滤,可以将内容过滤的很精确,有些在线的网站也可以帮我们生成一些常用的 正则表达式,比如https://www.hake.cc/tools/regexcode/
root@localhost \~# grep 'Failed password' /var/log/secure|grep --color -P "
(250-5|20-4\d|0-1\d{2}|1-9?\d)\.(250-5|20-4\d|0-1\d{2}|1-9?\d)\.
(250-5|20-4\d|0-1\d{2}|1-9?\d)\.(250-5|20-4\d|0-1\d{2}|1-9?\d)"
Mar 25 18:20:48 localhost sshd16905: Failed password for root from
192.168.61.1 port 55577 ssh2
ip地址都标红色了,表示匹配出来了。
如果只要ip地址-Po
root@localhost \~# grep 'Failed password' /var/log/secure|grep --color -Po "
(250-5|20-4\d|0-1\d{2}|1-9?\d)\.(250-5|20-4\d|0-1\d{2}|1-9?\d)\.
(250-5|20-4\d|0-1\d{2}|1-9?\d)\.(250-5|20-4\d|0-1\d{2}|1-9?\d)"
192.168.61.1
有些ip地址是重复的,因为尝试登录了很多次,那么可以先排序,再去重,来查看ip地址root@localhost \~# grep 'Failed password' /var/log/secure|grep --color -Po "
(250-5|20-4\d|0-1\d{2}|1-9?\d)\.(250-5|20-4\d|0-1\d{2}|1-9?\d)\.
(250-5|20-4\d|0-1\d{2}|1-9?\d)\.(250-5|20-4\d|0-1\d{2}|1-9?
\d)"|sort -n |uniq -c
2 192.168.2.113
3 192.168.2.116
1 192.168.61.1
比如,如果看到了这么个ip地址164.90.232.121、164.90.232.241等尝试登录了你上千上万次,就是 在爆破攻击我们,百度一查,德国的
我们可以直接拉黑这个ip地址,也叫做加黑,加入黑名单的意思,这个等后面我再教大家。
为了演示下面的参数,我们先创建一个示例环境,也就是一个练习文件:
root@localhost log# cd /root/
root@localhost \~# head -50 /etc/services > test.txt
root@localhost \~# ls
2.txt anaconda-ks.cfg jaden jaden17:52:30.txt jaden.txt test.txt xx.txt
#grep参数
-n 显示行号
root@localhost \~# grep -n 'tcp' test.txt
vi test.txt +48,表示进入vi的时候,光标直接定位的48行起始位置。
-c 对结果行计数
root@localhost \~# grep -c 'tcp' test.txt
14
-i 不区分大小写
root@localhost \~# grep -n 'tcp' test.txt -i
-v 反向搜索,取反
root@localhost \~# grep -n 'udp' test.txt -v # 将不含有udp的行全部过滤出来
-w 精准匹配
root@localhost \~# grep -w 'tcp' test.txt
-o 只显示匹配的结果,前面的第一个示例中我们用过-o参数
root@localhost \~# grep -o -n 'tcp' test.txt
-A1 同时打印搜索结果行的后一行 ,A是after的简写
root@localhost \~# grep -A2 'ftp' test.txt
root@localhost \~# grep -A 2 'ftp' test.txt
-B3 同时打印搜索结果行的前三行,B是before的简写
root@localhost \~# grep -B2 'ftp' test.txt
-C2 同时打印搜索结果行的上下各两行
root@localhost \~# grep -C2 'ftp' test.txt
-E 扩展正则表达式
正则我们下面会细讲,先简单了解一下。
root@localhost \~# grep -E '.tp' test.txt # .就是正则表达式,表示任意的一个字符
root@localhost \~# grep -E 'ftp|ssh' test.txt # 查找ftp或者ssh,|是或者的意思, 可以用多个ftp|ssh|telnet...
-P 使用perl正则
perl语言中设计的正则表达式写法规则,很强大,很多领域都支持perl正则的语法结构。
root@localhost \~# grep -P "\d+" test.txt # 匹配所有的数字
root@localhost \~# grep -P "\d{4,}" test.txt #匹配4位的数字
4.2 sed
这个我们用的其实很少,所以大家简单学习一下即可。
#擅长取行和修改替换
用法:sed -nri 动作 目标文件文件
选项与参数:
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端 上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-r :sed 的动作支持的是延伸型正则表示法的语法。(默认是基础正则表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。
动作说明: n1\[,n2]function
n1, n2一般表示为行号,,n2表示这个参数可选,可有可无。
function:
a :指定行后面插入一行
d :删除
i :指定行前面插入一行
p :打印,#一般和前面的-n参数一起用
s :替换 需要I忽略大小写,全局替换需要g
sed过滤
sed也可以进行过滤,如下简单示例
root@localhost \~# seq 5 > 1.txt
root@localhost \~# vi 1.txt # 修改为如下内容
root@localhost \~# cat 1.txt
1
2c
3a
4b
5a
root@localhost \~# sed '/a/p' 1.txt #默认会将所有行都打印出来,并且匹配到的a所在的 行重新打印一遍
1
2c
3a
3a
4b
5a
5a
root@localhost \~# sed -n '/a/p' 1.txt # 加上-n,进入安静(silent)模式,就不会 将所有内容打印出来了。
3a
5a
sed过滤相比grep来说,就比较麻烦。所以,过滤我们一般用grep。
root@localhost \~# sed -n '/tcp/p' test.txt # 也能过滤出tcp所在的行
sed删除匹配的行数据
root@localhost \~# sed '/tcp/d' test.txt # 删除所有带tcp的行,并不是删除原文件 中的数据,而是将删除之后的结果打印出来了。
所以只需要一个重定向,就拿到删除之后的结果了
root@localhost \~# sed '/tcp/d' test.txt > 2.txt
root@localhost \~# cat -n 2.txt
-i就可以直接删除原文件的数据
root@localhost \~# sed -i '/tcp/d' test.txt
root@localhost \~# cat -n test.txt
root@localhost \~# sed -i '/udp/d' test.txt
root@localhost \~# cat -n test.txt
root@localhost \~# sed '/^#/d' test.txt # 删除以#开头的行,^表示以什么开头的正则表 达式,我没有加-i昂
指定行号来删除
root@localhost \~# sed '1,10d' test.txt # 删除1-10行的数据
root@localhost \~# sed -i '1,10d' test.txt
只要1-5行的数据
root@localhost \~# sed -n '1,5p' test.txt
只要第5行的数据
root@localhost \~# sed -n '5p' test.txt
插入数据
在第三行后面插入一行数据
root@localhost \~# sed '3a hello jaden' 1.txt
1
2c
3a
hello jaden
4b
5a
在第2行前面插入一行数据
root@localhost \~# sed '2i hello jaden' 1.txt
1
hello jaden
2c
3a
4b
5a
加上-i参数就能直接修改原文件
root@localhost \~# sed -i '2i hello jaden' 1.txt
root@localhost \~# cat 1.txt
1
hello
jaden
2c
3a
4b
5a
替换数据
把3a替换成wuLAOBAN
root@localhost \~# sed 's#3a#wuLAOBAN#' 1.txt
1
hello jaden
2c
wuLAOBAN
4b
5a
root@localhost \~# sed -i 's#3a#wuLAOBAN#' 1.txt
root@localhost \~# cat 1.txt
1
hello jaden
2c
wuLAOBAN
4b
5a
把A替换成xxx,每行只替换一次,同一行的第二个及之后的A都不进行替换
root@localhost \~# sed 's#A#xxx#' 1.txt
1
hello jaden
2c
wuLxxxOBAN
4b
5a
把所有的A都替换成xxx
root@localhost \~# sed 's#A#xxx#g' 1.txt
1
hello jaden
2c
wuLxxxOBxxxN
4b
5a
把所有的A和a都替换成xxx,忽略大小写,参数I
root@localhost \~# sed 's#A#xxx#gI' 1.txt
1
hello jxxxden
2c
wuLxxxOBxxxN
4b
5xxx
4.3 awk
擅长取列
用法,取列
比如3.txt内容如下:
2 this is a test
3 Do you like awk
This's a test
10 There are orange,apple,mongo
例子1: 取列
root@localhost \~# vi 3.txt
root@localhost \~# cat 3.txt
2 this is a test
3 Do you like awk
This's a test
10 There are orange,apple,mongo
root@localhost \~# awk '{print $1}' 3.txt
2
3
This's
10
root@localhost \~# awk '{print $3}' 3.txt # 取第三列
root@localhost \~# awk '{print $NF}' 3.txt # 取每一行的最后一列,NF是固定写法
test
awk
test
orange,apple,mongo
root@localhost \~# awk '{print 1,NF}' 3.txt # 取第一列和最后一列
2 test
3 awk
This's test
10 orange,apple,mongo
root@localhost \~# awk '{print NF,1}' 3.txt # 还可以反着写,所以通过awk,可以 将列顺序重新排版
root@localhost \~# awk '{print 1,4}' jaden.txt # 取出第一列和第四列
例子2:计算
vi 4.txt,写上如下内容
水果,每斤多少钱,总共多少斤
orange 10 20
apple 20 30
mongo 50 10
banana 5 200
开始计算
root@localhost \~# awk '{print 1,2*$3}' 4.txt
orange 200
apple 600
mongo 500
banana 1000
还可以加备注信息:root@localhost \~# awk '{print 1"总价为:",2*$3"元"}' 4.txt orange总价为: 200元
apple总价为: 600元
mongo总价为: 500元
banana总价为: 1000元
例子3:根据行号来筛选内容
a = 1表示变量赋值,让a=1
a == 1,表示判断一下a的值是不是等于1,等于1那么条件判断结果为真,不等1那么条件判断结果为假
支持符号: > < == >= <=
root@localhost \~# awk 'NR==1' 4.txt # 取出第一行数据,grep不会取出特定的行,只能筛选 某些行
orange 10 20
root@localhost \~# awk 'NR>2' 4.txt # 取出行号大于2的行数据
mongo 50 10
banana 5 200
root@localhost \~# awk 'NR<=3' 4.txt # 取出行号小于等于3的行数据
orange 10 20
apple 20 30
mongo 50 10
root@localhost \~# awk 'NR<=3 && NR>1' 4.txt # 取出行号大于1并且小于等于3的行
apple 20 30
mongo 50 10
还可以取行的同时来取列
root@localhost \~# awk 'NR<=3{print $1}' 4.txt
orange
apple
mongo
例子4:
还可以过滤出指定的行,awk也能做过滤,但是
root@localhost \~# awk '/apple/' 4.txt # 取出含有apple数据的行数据
apple 20 30
grep、sed、awk过滤对比
grep 'apple' 4.txt
sed -n '1,2p' 4.txt
awk 'NR>1 && NR<=3' 4.txt
例子5:
再比如我们刚才取ip地址:比直接写正则要方便很多
root@localhost log# grep 'Failed password' secure
Mar 25 18:20:48 localhost sshd16905: Failed password for root from
192.168.61.1 port 55577 ssh2
Mar 25 18:49:26 localhost sshd1498: Failed password for root from
192.168.2.113 port 49991 ssh2
...
root@localhost log# grep 'Failed password' secure|awk '{print $11}'
192.168.61.1
192.168.2.113
192.168.2.116
...
例子6: 指定分隔符,默认是按照空格作为分隔符的
awk -F ":" '{print 7,1}' /etc/passwd # 这个文件都是用:做的分隔符
root@localhost \~# awk -F ':' 'NR==3 || NR==5 {print $1}' /etc/passwd # 取出第三行和第五行的第一列数据,分隔符为:
daemon
lp
&&表示and,两个条件同时成立
||表示or,满足一个条件即可
例子7: 拼凑指定文本,双引号之间原样输出
awk -F ":" '{print 1":123:"7}' /etc/passwd
root@localhost \~# awk -F ":" '{print 1":123:"7}' /etc/passwd
root:123:/bin/bash
bin:123:/sbin/nologin
...
例子8: 过滤文本
awk -F " /+" '$2~/^47/' 1.txt
找出第一列数据中带h的,并取出第一列和第七列的数据
root@localhost \~# awk -F ':' '1\~/h/{print 1,$7}' /etc/passwd
shutdown /sbin/shutdown
halt /sbin/halt
sshd /sbin/nologin
chrony /sbin/nologin
apache /sbin/nologin
五.总结
今天说的内容还是很多的,但是我觉得做个了解就好了,还是点赞关注加收藏,后期要用到了再来看。