1.特殊符号
***********************************#**********************************
# : 注释、备注、批注,系统自动忽略,不执行。
# 系统不执行被#号注释的内容
[root@localhost html]# #
[root@localhost html]#
***********************************;**********************************
# ;命令的分隔符,通过它可以连接多条指令,一起执行
# 查看youxi下的所有文件及其内容&打印123
ll youxi;echo 123
***********************************..**********************************
# ..代表上级目录
# 返回上级目录
cd ..
***********************************.**********************************
# .代表当前目录
# 将man_db.conf文件在当前目录复制一份
cp /data/man_db.conf .
***********************************环境变量**********************************
# 查看系统内置的环境变量
env
# 查看某个变量的值
# $符号+变量名称
eg:echo $LANG
# 修改(声明)环境变量
# export 变量名称=值
export LANG=en_US.UTF-8
***********************************双引号与单引号**********************************
# 双引号 用于换行,解析变量
# 用于换行
[root@localhost html]# echo "小王
> 小高
> 小张
> "
小王
小高
小张
# 解析变量
[root@localhost html]# echo "$LANG"
zh_CN.UTF-8
# 单引号,换行,不解析变量
# 用于换行
[root@localhost html]# echo '小王
> 小张
> 小李
> '
小王
小张
小李
# 不解析变量
[root@localhost html]# echo '$LANG'
$LANG
***********************************\和/**********************************
# \ 转义符,反斜杠
# / 路径分隔符
# 转义符案例
date +%F\ %T
***********************************history**********************************
# 历史命令调用 ——> 使用!
# 查看历史命令
history
# 执行某条历史指令
!历史指令序号
# ########################################### * ###########################################
# 通配符
# 查看所有.txt结尾的文件
ls *.txt
# ********************************** $ **********************************
# 调用变量
export LANG='en_US.UTF-8'
echo $LANG
注意:使用变量的时候要小心,比如有些人操作变量的时候,删除了根目录,如下
# 定义变量
[root@localhost html]# wz=/tmp
# 查看变量值
[root@localhost html]# echo $wz
/tmp
# 删除/tmp目录下的所有内容
[root@localhost html]# rm -rf $wz/*
# 但是如果变量值写错了,系统做删除的时候,找不到这个变量,那么会变成如下效果
[root@localhost html]# rm -rf /*
# 就删除根目录了,系统崩溃了就
# ********************************** 输入输出重定向,即< > **********************************
# 输出重定向
# 输出重定向【将services中前五行的数据写入到data.txt文件中】
head -5 /etc/services > data.txt
# 标准错误输出重定向
head -5 /etc/services 1>right.txt 2>error.txt
# 清空文件内容
> data.txt
# 输入重定向
# 输入重定向【直接把data.txt文件内容传递给cat命令,即cat 仅接收到了内容,而不是文件本身】
cat < data.txt
# 将data.txt中的数据输入过来并写入data1.txt中【写入data1.txt先将里面的数据清除掉】
cat < data.txt > data1.txt
# 基于cat实现不断的输出值【值都是打印到屏幕上】 直到0停止
cat << 0
# 基于cat实现不断的输出值并保存到data3.txt中【值都是打印到屏幕上】 直到0停止
cat << 0 > data3.txt
# ********************************** | 管道 **********************************
# 将前面的输出当后面的结果
# 查看ip地址
ip a|head -9|tail -1
# ********************************** || 双管道 **********************************
”“”
规则:
第一个命令成功,不会执行第二个命令
第一个命令是失败,就会执行第二个命令
"""
[root@localhost tmp]# cat 1.txt
cat: 1.txt: No such file or directory
# 第一个命令成功,不会执行第二个命令
[root@localhost tmp]# echo 123||echo 456
123
# 第一个命令是失败,就会执行第二个命令
[root@localhost tmp]# cat 1.txt||echo 123
cat: 1.txt: No such file or directory
123
# ********************************** && **********************************
”“”
规则:
如果第一个失败了,两个都不执行
如果第一个成功了,第二个失败了,就执行第一个
如果两个都成功了,就都执行
"""
# 如果第一个失败了,两个都不执行
[root@localhost tmp]# cat 1.txt&&echo 123
cat: 1.txt: No such file or directory
# 如果第一个成功了,第二个失败了,就执行第一个
[root@localhost tmp]# echo 123&&cat 1.txt
123
cat: 1.txt: No such file or directory
# 如果两个都成功了,就都执行
[root@localhost tmp]# echo 123&&echo 456
123
456
# ********************************** &(后台运行) **********************************
# 比如top指令,之前运行top,会占住终端,除非结束top,不然不能执行其他指令
[root@localhost tmp]# top&
[1] 2040
[root@localhost tmp]# ps -ef |grep top
root 2040 1532 0 02:29 pts/0 00:00:00 top
root 2042 1532 0 02:29 pts/0 00:00:00 grep --color=auto top
# ********************************** ~(代表家目录) **********************************
# 不同的用户家目录不同
# 回到家目录
cd ~
# **********************************`反引号` **********************************
# 用来嵌套命令,反引号中的命令先执行
# 先执行date +%F结果,然后创建文件
touch `date +%F`.txt
# 先打印wz,再创建文件夹
mkdir `echo wz`
2.三剑客
grep
擅长过滤,或者说查找,按行来过滤
顺便提一嘴常见的攻击方式:爆破攻击
是一种使用自动化工具大量尝试不同的用户名和密码,强行进行系统的攻击方式。攻击者重复尝试,知道找到正确的凭证,从而获得系统的未授权访问!
# /var/log/secure是记录用户登录系统的行为的,登录成功还是失败,系统都会自动记录这次登录动作。
# 逐行筛选/var/log/下的secure文件中带有'Failed password'的行【以下两种方式都可以】
cat /var/log/secure | grep 'Failed password'
grep 'Failed password' /var/log/secure
# 想将所有登录失败的ip地址找出来,可以再次过滤
# 比如查看某个ip地址登录了多少次
cat /var/log/secure | grep 'Failed password' | grep '192.168.129.1' | wc -l
grep 'Failed password' /var/log/secure | grep '192.168.129.1' | wc -l
# 想要筛选所有的ip所在行并标红【-p】
cat /var/log/secure | grep 'Failed password' | grep --color -P "(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)"
# 只要筛选出来每行的ip所并对该ip标红【-Po】
cat /var/log/secure | grep 'Failed password' | grep --color -Po "(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)"
# 排序加去重加统计重复行数【sort -n |uniq -c】
# 在上面的基础上排序并去重
cat /var/log/secure | grep 'Failed password' | grep --color -Po "(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)" | sort -n | uniq -c
用法
cd /root/
head -50 /etc/services > data.txt
ls
# 参数相关
-n 显示行号
# 筛选data.txt中tcp所在的行,同时并显示所在的行号
[root@localhost ~]# grep -n 'tcp' data.txt
-c 对结果行计数
# 筛选data.txt中含有tcp的行数,然后输出数量
[root@localhost ~]# grep -c 'tcp' data.txt
-i 不区分大小写
# 筛选data.txt中含有tcp(不管大写小写)所在的行
[root@localhost ~]# grep -n -i 'tcp' test.txt
-v 反向搜索,取反
# 筛选data.txt中除了tcp所在的其他所有行,并显示行号
[root@localhost ~]# grep -n -v 'tcp' data.txt
-w 精准匹配
# 筛选data.txt中完全匹配到tcp所在的行,并显示行号
[root@localhost ~]# grep -w -n 'TCP' data.txt
-o 表示只输出匹配到的部分,而不是整行。这意味着命令只会显示符合条件的字符串
# 筛选所有的tcp并显示行号
[root@localhost ~]# grep -o -n 'tcp' data.txt
-A1 同时打印搜索结果行的后一行 ,A是after的简写
# 筛选所有的tcp并打印每个筛选出来行的后一行,并显示行号
[root@localhost ~]# grep -A1 -n 'tcp' data.txt
-B3 同时打印搜索结果行的前三行,B是before的简写
# 筛选所有的tcp,并在筛选到结果的前三行之前打印出来,并显示行号
[root@localhost ~]# grep -B3 -n 'tcp' data.txt
-C2 同时打印搜索结果行的上下各两行
# 筛选所有的tcp,并在筛选到结果的上下各两行打印出来,并显示行号
[root@localhost ~]# grep -C2 -n 'tcp' data.txt
-E 扩展正则表达式
-P 使用perl正则
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
注意s参数的使用:
s/ 后面的模式替换需要包含三部分:拿这个s/pattern/replacement/举例
s/ 后接要匹配的 模式,然后用 / 分隔,再接 替换的内容,最后用 / 结束 eg: sed -i 's/#.*//g' 11.txt
# ############################################## 过滤 ############################################
# 生成从 1 到 5 的数字序列
seq 5 > data1.txt
# 默认会将所有行都打印出来,并且匹配到的1所在的行重新打印一遍
sed '/1/p' data1.txt
# 加上-n,进入安静(silent)模式,就不会将所有内容打印出来了。
sed -n '/1/p' data1.txt
# 过滤出tcp所在的行
sed -n '/tcp/p' data.txt
# 打印data1.txt中所有行
sed -n 'p' data.txt
# 打印1-5行的数据
sed -n '1,5p' data.txt
# 打印第5行的数据
sed -n '5p' data.txt
# ############################################## 删除 ############################################
# 将删除成功的数据后的结果打印出来【并没有删除原来文件】
sed '/tcp/d' data.txt
# 重定向删除之后的结果到udp.txt中
sed '/tcp/d' d ata.txt > udp.txt
# 打印 data.txt文件内容时删除以#开头的行【并没有删除原来文件】
sed '/^#/d' data.txt
# 直接删除原文件的数据【-i参数】
sed -i '/tcp/d' data.txt
# 指定行号来删除
# 删除1-22行的数据,并将剩下的结果打印出来【并没有删除原来文件】
sed '1,22d' data.txt
# ############################################## 插入 ############################################
# 在第二行后面插入一行数据【a参数表示插入】 【并没有修改原来文件】
sed '2a hello gt' data1.txt
# 在第2行前面插入一行数据 【并没有修改原来文件】
sed '2i hello gt' data1.txt
# 加上-i参数就能直接修改原文件
sed -i '2a hello gt' data1.txt
# ############################################## 替换 ############################################
# 在文件 data.txt 中查找所有的 "udp" 字符串,并把udp替换成cad【并没有替换原来文件,只要不加-i就不是在源文件替换】
sed 's#udp#cad#' data.txt
# 把1替换成11,每行只替换一次,同一行的第二个及之后的1都不进行替换,其实和上面效果一样
sed 's#1#11#' data1.txt
# 把所有的tcp都替换成alg
sed 's#tcp#alg#g' data.txt
# 把所有的tcp和TCP都替换成xxx,忽略大小写,参数I
sed 's#tcp#xxx#gI' data.txt
awk
擅长取列
比如data.txt内容如下:
2 this is a test
3 Do you like awk
This's a test
10 There are orange,apple,mongo
# ############################################## 取列 ############################################
# 打印第一列
awk '{print $1}' data.txt
# 打印第三列
awk '{print $1}' data.txt
# 取每一行的最后一列,NF是固定写法
awk '{print $NF}' data.txt
# 取第一列和最后一列【取多列用逗号隔开】
awk '{print $1,$NF}' data.txt
# 取最后一列和第一列【也可以反着写】
awk '{print $NF,$1}' data.txt
# 取出第一列和第四列
awk '{print $1,$4}' data.txt
比如data1.txt内容如下:
orange 10 20
apple 20 30
mongo 50 10
banana 5 200
# ############################################## 计算 ############################################
# 取第一列,第二列乘以第三列的总和
awk '{print $1,$2*$3}' data1.txt
# 还可以加备注信息:
awk '{print $1"总价格为:",$2*$3"元"}' data1.txt
# ############################################## 根据行号来筛选内容 ############################################
# 取出第一行数据【grep不会取出特定的行,只能筛选某些行】
awk 'NR==1' data1.txt
# 取出行号大于2的行数据
awk 'NR>2' data1.txt
# 取出行号小于等于3的行数据
awk 'NR<=3' data1.txt
# 取出行号大于1并且小于等于3的行
awk 'NR>1 && NR<=3' data1.txt
# 还可以取行的同时来取列
awk 'NR<=3{print $1}' data1.txt
# 过滤出指定的行
# 取出含有apple数据的行数据
awk '/apple/' data1.txt
# grep、sed、awk过滤对比
"""
grep 'apple' data1.txt
sed -n '1,2p' data1.txt
awk 'NR>1 && NR<=3' data1.txt
"""
# 取/var/log/secure下的ip
grep 'Failed password' /var/log/secure
# 指定分隔符,默认是按照空格作为分隔符的【passwd这个文件都是用:做的分隔符,所以我用:来分隔】
# 取第七和第一列
awk -F ":" '{print $7,$1}' /etc/passwd
# 取出第一行和第二行的第一列数据
awk -F ':' 'NR==1 || NR==2 {print $1}' /etc/passwd
# 拼凑指定文本,双引号之间原样输出【指定以:分隔——> -F ":" 】
awk -F ":" '{print $1":-------:"$7}' /etc/passwd
# 找出第一列数据中带h的,并取出第一列和第七列的数据
awk -F ':' '$1~/h/{print $1,$7}' /etc/passwd
3.正则表达式
简单的说,正则表达式就是一套处理大量的字符串而定义的规则和方法
1) ^ 表示搜索以什么开头。
2) $ 表示搜索以什么结尾。
3) ^$ 表示空行,不是空格。
4) . 代表且只能代表任意一个字符。
5) \ 转义字符,让有着特殊身份意义的字符,脱掉马甲,还原原型。
例如:\.只表示小数点,还原原始小数点的意义。
6) * 重复0个或多个前面的一个字符。不代表所有了。
7) .* 匹配所有的字符。^.* 任意多个字符开头。
8) [abc] 匹配字符集合内任意一个字符[a-z]
9) [^abc] ^再中括号里面表示非,不包含a或b或c。
10) {n,m} 重复n到m次,前一个字符。
11) + 重复1次到多次
12) ? 重复0次到多次
准备:
head -100 /etc/services > data.txt
cat -n data.txt
# 1. ^ 表示搜索以什么开头
# 找出开头为#号的的行数据
grep '^#' data.txt
# 找出开头不是#号的行数据
grep -v '^#' data.txt
# 2. $ 表示搜索以什么结尾。
# 找出结尾为ol字母的行数据
grep 'ol$' data.txt
# 3. ^$ 表示空行,不是空格。
# 找出所有的空白行
grep '^$' data.txt
# 找出所有的非空白行数据【-v 表示相反】
grep -v '^$' data.txt
# 找到data.txt中所有的空行并删除,然后在源文件中生效
sed -i '/^$/d' data.txt
# 4. .代表且只能代表任意一个字符
# 找到data.txt中所有dp结尾所在的行
grep '.dp' data.txt
# 5. \ 转义字符
grep '\.' data.txt
# 6. * 重复0个或多个前面的一个字符。不代表所有了。
测试数据
vi num.txt
"""
a 12222
b 12222222
c 1
b 3
d 122222222222222
e 12
a 4
"""
grep '2' num.txt
grep '22' num.txt
# -o就能看出来,它是两个字符两个字符的匹配
grep -o '22' num.txt
grep '12' num.txt
grep '12*' num.txt
#
grep '.*' num.txt
# 继续来玩
# 复制一份/etc/services的前100行数据到serv文件中,然后将去掉serv文件中所有含有#的行和空行
head -100 /etc/services > file.txt
#################################基于sed实现删除#################################
# 去掉含有#号的行【源文件的也删除】
sed -i '/#/d' file.txt
# 去掉所有空行
sed -i '/^$/d' file.txt
#################################基于sed查找#################################
head -100 /etc/services > file1.txt
# 筛选含有#号或者空行的行
grep -E '^$|#' file1.txt
# 筛选不含有#号或者空行的行
grep -Ev '^$|#' file1.txt
# 去掉所有的注释
vi 11.txt
"""
hello -a #a表示友好
hello -b #b表示不友好
hello -c #c表示骂人
# 哈哈,这是个啥s
# what?
hello -d #d表示非常爱你
"""
# 解释:
s/模式替换后面有三个部分:
s/ 后接要匹配的模式 即#.* ——> 以#开头,后跟任意0到无数的字符
第二个/后接替换的内容 ——> 没写表示空
第三个/表示结束 g
表示全局替换,.即所有 # 及其后内容都被删除 不使用:只删除第一个 # 及其后内容,而其他部分则保持不变
# 去除11.txt文件中所有注释的内容
sed -i 's/#.*//g' 11.txt
# 删除11.txt文件中所有空行
sed -i '/^$/d' 11.txt
# 7. [abc] 匹配字符集合内任意一个字符[a-z]、[0-9]、[A-Z],多选一,[0,9]这个是2选1.
# 查找所有包含数字0~9的行,并输出这些行的行号和内容
grep -En '[0-9]' file1.txt
# 从文件file1.txt中查找包含字符 0 或 9 的行,,并输出这些行的行号和内容
grep -En '[0,9]' file1.txt
# 8.[^abc] ^在中括号里面表示非,不包含a或b或c。
# 从 file1.txt 文件中查找所有包含非数字字符的行
grep '[^0-9]*' file1.txt
# 从 file1.txt 文件中查找所有包含非小写字母的行并输出
grep '[^a-z]' file1.txt
# 从 file1.txt 文件中查找所有包含非字母和非数字的字符的行
grep '[^a-z0-9A-Z]' file1.txt
# 8.{n,m} 重复n到m次,前一个字符
# 输出 /var/log/secure 文件中所有由7到15个数字或小数点组成的部分
grep -Eo '[0-9.]{7,15}' /var/log/secure
# 9. + 重复1次到多次,和*不同
# 匹配任何以1开头,后面紧跟任意数量(包括零个)的 9 的字符串。
grep -E '19*' /var/log/secure
# 匹配任何包含1后紧跟一个或多个9的字符串
grep -E '19+' /var/log/secure
# 10. ? 重复0次到1次
# 匹配到一个就输出一个
grep -Eo '[0-9]*' /var/log/secure
# 更加贪婪一些【后面有就会接着匹配,匹配不到就匹配第一个输出】
grep -Eo '[0-9]?' /var/log/secure
# 取ip的例子:
grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /var/log/secure
标签:grep,特殊符号,sed,linux,root,txt,data,localhost
From: https://www.cnblogs.com/pythonav/p/18519767