# 查看文件内容
cat file1 从第一个字节开始正向查看文件的内容 tac file1 从最后一行开始反向查看一个文件的内容 more file1 查看一个长文件的内容 less file1 类似于 'more' 命令,但是它允许在文件中和正向操作一样的反向操作 head -2 file1 查看一个文件的前两行 tail -2 file1 查看一个文件的最后两行 tail -f /var/log/messages 实时查看被添加到一个文件中的内容
# 文本处理
cat file1 file2 ... | command <> file1_in.txt_or_file1_out.txt general syntax for text manipulation using PIPE, STDIN and STDOUT
cat file1 | command( sed, grep, awk, grep, etc...) > result.txt 合并一个文件的详细说明文本,并将简介写入一个新文件中
cat file1 | command( sed, grep, awk, grep, etc...) >> result.txt 合并一个文件的详细说明文本,并将简介写入一个已有的文件中
grep Aug /var/log/messages 在文件 '/var/log/messages'中查找关键词"Aug"
grep ^Aug /var/log/messages 在文件 '/var/log/messages'中查找以"Aug"开始的词汇
grep [0-9] /var/log/messages 选择 '/var/log/messages' 文件中所有包含数字的行
grep Aug -R /var/log/* 在目录 '/var/log' 及随后的目录中搜索字符串"Aug"
sed 's/stringa1/stringa2/g' example.txt 将example.txt文件中的 "string1" 替换成 "string2"
sed '/^$/d' example.txt 从example.txt文件中删除所有空白行
sed '/ *#/d; /^$/d' example.txt 从example.txt文件中删除所有注释和空白行
echo 'esempio' | tr '[:lower:]' '[:upper:]' 合并上下单元格内容
sed -e '1d' result.txt 从文件example.txt 中排除第一行
sed -n '/stringa1/p' 查看只包含词汇 "string1"的行
sed -e 's/ *$//' example.txt 删除每一行最后的空白字符
sed -e 's/stringa1//g' example.txt 从文档中只删除词汇 "string1" 并保留剩余全部
sed -n '1,5p;5q' example.txt 查看从第一行到第5行内容
sed -n '5p;5q' example.txt 查看第5行
sed -e 's/00*/0/g' example.txt 用单个零替换多个零
cat -n file1 标示文件的行数
cat example.txt | awk 'NR%2==1' 删除example.txt文件中的所有偶数行
echo a b c | awk '{print $1}' 查看一行第一栏
echo a b c | awk '{print $1,$3}' 查看一行的第一和第三栏
paste file1 file2 合并两个文件或两栏的内容
paste -d '+' file1 file2 合并两个文件或两栏的内容,中间用"+"区分
sort file1 file2 排序两个文件的内容
sort file1 file2 | uniq 取出两个文件的并集(重复的行只保留一份)
sort file1 file2 | uniq -u 删除交集,留下其他的行
sort file1 file2 | uniq -d 取出两个文件的交集(只留下同时存在于两个文件中的文件)
comm -1 file1 file2 比较两个文件的内容只删除 'file1' 所包含的内容
comm -2 file1 file2 比较两个文件的内容只删除 'file2' 所包含的内容
comm -3 file1 file2 比较两个文件的内容只删除两个文件共有的部分
十六、字符设置和文件格式转换
dos2unix filedos.txt fileunix.txt 将一个文本文件的格式从MSDOS转换成UNIX
unix2dos fileunix.txt filedos.txt 将一个文本文件的格式从UNIX转换成MSDOS
recode ..HTML < page.txt > page.html 将一个文本文件转换成html
recode -l | more 显示所有允许的转换格式# sed-split-从日志中截取某个时间段的日志分析
https://abc.htmltoo.com/thread-45990.htm
# 快速清空一个文件
>filename
cat /dev/null > filename
echo > filename
-不停止服务清空该文件的命令:
cp /dev/null filename
# 快速生成一个大文件
-生成一个文件名为rumenz.img 大小为 1G 的文件。
dd if=/dev/zero of=rumenz.img bs=1M count=1024
# zgrep查找压缩包文件文本
-a 让其二进制文件当做文本处理
-n 显示行号
-H 显示文件名
-使用 zgrep 来一步完成
zgrep "/rumenz" access_log.gz
-zgrep 也可以指定多个文件同时进行搜索过滤
zgrep "/rumenz" access_log.gz error.gz
-查找.tar.gz文件
zgrep -anH "rumenz" rumenz.tar.gz
rumenz.tar.gz:9:rumenz
在使用linux时,经常需要进行文件查找。其中查找的命令主要有find和grep。两个命令是有区的。
区别:
(1)find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等。
(2)grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式(patter)进行匹配查找。
一.find命令
基本格式:find path expression
1.按照文件名查找
find / -name httpd.conf #在根目录下查找文件httpd.conf,表示在整个硬盘查找 find /etc -name httpd.conf #在/etc目录下文件httpd.conf find /etc -name ‘srm‘ #使用通配符(0或者任意多个)。表示在/etc目录下查找文件名中含有字符串‘srm’的文件 find . -name ‘srm‘ #表示当前目录下查找文件名开头是字符串‘srm’的文件
2.按照文件特征查找
find / -amin -10 # 查找在系统中最后10分钟访问的文件(access time) find / -atime -2 # 查找在系统中最后48小时访问的文件 find / -empty # 查找在系统中为空的文件或者文件夹 find / -group cat # 查找在系统中属于 group为cat的文件 find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件(modify time) find / -mtime -1 #查找在系统中最后24小时里修改过的文件 find / -user fred #查找在系统中属于fred这个用户的文件 find / -size +10000c #查找出大于10000000字节的文件(c:字节,w:双字,k:KB,M:MB,G:GB) find / -size -1000k #查找出小于1000KB的文件
3.使用混合查找方式查找文件
参数有: !,-and(-a),-or(-o)。
find /tmp -size +10000c -and -mtime +2 #在/tmp目录下查找大于10000字节并在最后2分钟内修改的文件 find / -user fred -or -user george #在/目录下查找用户是fred或者george的文件文件 find /tmp ! -user panda #在/tmp目录中查找所有不属于panda用户的文件
4.
-将删除所有在3天之前修改过且文件名以 .log 结尾的文件
find /data -mtime +3 -name "*.log" -delete
-目录中查找修改时间在3天之前的文件或文件夹,并将它们删除
find /data -mtime +3 -delete
-查找占用空间超过500M的文件:
find / -xdev -size +500M -exec ls -l {} \;
-查找最近24-48小时修改过的常规文件。
find /data -type f -mtime 1
-查找最近1天前修改过的常规文件。
find /data -type f -mtime +1
-查找最近24小时修改目录下的.php文件,并列出详细信息
find /data -name '*.inc' -mtime 0 -ls
-查找最近30分钟修改的目录下的.php文件
find /data -name '*.php' -mmin -30
-查找最近24小时修改的当前目录下的.php文件
find /data -name '*.php' -mtime 0
find . -name “*.tar” -exec mv {}./backup/ ; # 查找当前目录下所有以.tar结尾的文件然后移动到指定目录:
find . -name "*.log" –mtime +30 –typef –size +100M |xargs rm -rf {};
-查找当前目录30天以前大于100M的LOG文件并删除。
sed-i 's/^.//g' test.txt # 如何去掉行首的.字符:
sed's/^/a/g' test.txt # 在行首添加一个a字符:
sed's/$/a/' tets.txt # 在行尾添加一个a字符
sed '/wuguangke/ac' test.txt # 在特定行后添加一个c字符
sed'/wuguangke/ic' test.txt # 在行前加入一个c字符5.如何判断某个目录是否存在,不存在则新建,存在则打印信息。
if [! –d /data/backup/];then Mkdir–p /data/backup/ else echo "The Directory alreadyexists,please exit" fi
6.监控linux磁盘根分区,如果根分区空间大于等于90%,发送邮件给Linux SA
while sleep 5m
do
for i in `df -h |sed -n '//$/p' |awk '{print $5}' |sed 's/%//g'`
do
echo $i
if [ $i -ge 90 ];then
echo “More than 90% Linux of disk space ,Please LinuxSA Check Linux Disk !” |mail -s “Warn Linux / Parts is $i%”
XXX@XXX.XX
fi
done
done7. 统计Nginx访问日志,访问量排在前20 的 ip地址:
cat access.log |awk '{print $1}'|sort|uniq -c |sort -nr |head -208.sed另外一个用法找到当前行,然后在修改该行后面的参数:
sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config sed -i ‘s:/tmp:/tmp/abc/:g’ test.txt # /tmp改成/tmp/abc/ sed -e ‘s/jk$/yz/g’ b.txt # 修改文本中以jk结尾的替换成yz
9.网络抓包:tcpdump
tcpdump -nn host 192.168.56.7 and port 80 # 抓取56.7通过80请求的数据包。 tcpdump -nn host 192.168.56.7 or ! host 192.168.0.22 and port 80 # 排除0.22 80端口! tcp/ip 7层协议物理层–数据链路层-网络层-传输层-会话层-表示层-应用层。
10.显示最常用的20条命令
cat .bash_history |grep -v ^# |awk ‘{print $1}’ |sort |uniq -c |sort -nr |head-2011.写一个脚本查找最后创建时间是3天前,后缀是*.log的文件并删除。
find . -mtime +3 -name "*.log" |xargs rm -rf {} ;12.写一个脚本将某目录下大于100k的文件移动至/tmp下。
find . -size +100k -exec mv {} /tmp ;13.写一个脚本进行nginx日志统计,得到访问ip最多的前10个
cat access.logok |awk '{print $1}'|sort -n|uniq -c|sort -nr |head -1014.替换文件中的目录
sed 's:/user/local:/tmp:g' test.txt sed -i 's//usr/local//tmp/g' test.txt
15. find 查找文件
find . -name FILE_NAME # 忽略文件名称大小写
find . -iname FILE_NAME # 查找/etc/下名称中带有 passwd 的文件,查找一层
find /etc -maxdepth 1 -name passwd # 查找/mnt 文件大小近似 20k 的文件
find /mnt -size 20K # 查找/mnt 文件大小大于 20k 的文件
find /mnt -size +20K # 查找/mnt 文件大小小于 20k 的文件
find /mnt -size -20K # 查找/etc/下名称中带有*.conf 的文件,且只查找第二层
find /etc -maxdepth 2 -mindepth 2 -name *.conf # 按 type 查找/mnt 中目录
find /mnt -type d # 按 type 查找/mnt 中文件
find /mnt -type f # 查找/mnt 中十分钟左右修改的
find /mnt -cmin 10 # 查找/mnt 中十分钟以上修改的
find /mnt -cmin +10 # 查找/mnt 中十分钟以内修改的
find /mnt -cmin -10 # 查找/mnt 中十天左右修改
find /mnt -ctime 10 # 查找/mnt 中十天以上修改
find /mnt -ctime +10 # 查找/mnt 中十天以内修改
find /mnt -ctime -10 # 模糊搜索,在$HOME目录下查找后缀txt的文件
find ~ -name "*.txt" -print # 使用正则表达式,查找当前目录及子目录里大写开头的文件
find . -name "[A-Z]*" -print # 在/etc里找host开头的文件
find /etc -name "host*" -print # 查找两个小写字母开头,后跟两个数字的文件
find . -name "[a-z][a-z][0-9][0-9].txt" -print # 当前目录下找权限为755的文件
find . -perm 755 -print # 忽略/apps/bin目录进行查找
find /apps -name "/apps/bin" -prune -o -print # 用ls -l 列出所找到的文件
find . -type f -exec ls -l {} \; # 删除5天前的日志
find . -name "*.LOG" -mtime +5 -ok rm {} \;
find /home/hap/src/* -name "*.o" -exec rm {} \;# 使用xargs
find / -type f -print | xargs grep "device" # 用grep命令在所有的普通文件中搜索device单词 find . -type -size +200M # 查找大文件 find . -type f -size +400M -print0 | xargs -0 du -h # 查找大于400M的文件
# linux下查找指定后缀的文件
---查找当前目录下的所有后缀名时.c或.h的文件
find . -type f -regex ".*\.\(c\|h\)"
---查找所有后缀名时key的文件
find / -type f -regex ".*\.\(key\)"
二、grep命令
基本格式:find expression
1.主要参数
[options]主要参数:
-c:只输出匹配行的计数。
-i:不区分大小写
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
pattern正则表达式主要参数:
\: 忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的开始行。
$: 匹配正则表达式的结束行。
\<:从匹配正则表达 式的行开始。
>:到匹配正则表达式的行结束。
[ ]:单个字符,如[A]即A符合要求 。
[ – ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
.:所有的单个字符。
* :有字符,长度可以为0。
2.实例
grep ‘test’ d* # 显示所有以d开头的文件中包含 test的行
grep ‘test’ aa bb cc # 显示在aa,bb,cc文件中包含test的行
grep ‘[a-z]{5}’ aa # 显示所有包含每行字符串至少有5个连续小写字符的字符串的行
grep magic /usr/src # 显示/usr/src目录下的文件(不含子目录)包含magic的行
grep -r magic /usr/src # 显示/usr/src目录下的文件(包含子目录)包含magic的行
grep -w pattern files # 只匹配整个单词,而不是字符串的一部分(如匹配magic,而不是magical)
grep -f a.txt b.txt ## 以a.txt每一行为元素, 在b.txt中进行匹配3.grep 搜索字符
-c: 仅显示找到的行数.
-i: 忽略大小写.
-n: 显示行号.
-v: 反向选择, 仅列出没有关键词的行, v是invert的缩写.
-r: 递归搜索文件目录.
-C n: 打印匹配行的前后n行
grep login ImUser.cpp # 在指定文件查找,查找 login 关键字
grep login ImUser.cpp MsgConn.cpp # 多个文件中搜索
grep login *.cpp # 在以 cpp 结尾的文件中,搜索包含 login 的行
grep login -r msg_server/ # 递归搜索所有文件,搜索msg_server目录下所有文件,打印出login行
grep -v login ImUser.cpp # 反向查找,查找文件中,不包含login的行
grep -n login ImUser.cpp # 找出文件中包含 login 的行,并打印出行号
grep -C 3 -n login ImUser.cpp # 找出文件中包含 login 的行,打印出行号,并显示前后 3 行
grep -C 3 -i -n login ImUser.cpp # 找出文件中包含 login 的行,打印出行号,并显示前后 3 行,并忽略大小写
grep 'a' *.txt --color=auto # 从.txt文件中查找包含'a'字符串的文本文件
grep '[a-z]\{4\}' *.txt # 搜索包含连续4个字符的文件
grep 'fatal\|error\|critical' /var/log/nginx/error.log # 正在Nginx日志错误文件中搜索所有出现致命,错误和严重的单词
#如果要搜索的字符串包含空格,请用双引号将其引起来。
#这是使用扩展正则表达式的相同示例,它消除了对运算符|进行转义的需要。
grep -E 'fatal|error|critical' /var/log/nginx/error.log
grep -i 'fatal\|error\|critical' /var/log/nginx/error.log # 搜索时忽略大小写
#搜索字符串时,grep将显示该字符串嵌入较大字符串中的所有行。
因此,如果您要搜索“错误”,则grep还将在较大的单词(例如“ errorless”或“ antiterrorists”)中嵌入“ error”的行。
要仅返回指定字符串是整个单词(用非单词字符括起来)的那些行。
文字字符包括字母数字字符(a-z,A-Z和0-9)和下划线(_)。 所有其他字符均视为非单词字符。
grep -w 'fatal\|error\|critical' /var/log/nginx/error.log三. sed 从文件中查找
sed -n '2p' sed.txt # 打印第2行 sed -n '1,3p' sed.txt # 打印1~3行 sed -n '1,3p' sed.txt >sed.tmp # 1~3行输出到sed.tmp文件里 sed -n '1,$p' sed.txt # 显示全文 sed -n '1p' sed.txt # 打印首行 sed -n '$p' sed.txt # 打印最后一行 sed '2p' sed.txt # 输出全部文本,然后输出第2行 sed -n '/should/'p sed.txt # 查找should的行 sed -n '/should/=' sed.txt # 输出匹配的行号 sed -n '/\./'p sed.txt # 特殊字符查询,需要\进行转义 sed '1,3d' sed.txt # 删除1~3行 sed '/should/d' sed.txt # 删除包含should的行 sed 's/PS/ps/' sed.txt # 替换每行第一个单词 sed 's/PS/ps/g' sed.txt # 全文替换 sed '1,3 s/should/SHOULD/g' sed.txt # 指定行替换 sed '1 s/should/SHOULD/g' sed.txt # 指定行范围替换 sed 'Nd' file # 删除第N行 sed '1d' sed-demo.txt # 删除第1行 sed '$d' sed-demo.txt # 用美元符号 $ 表示最后,所以删除最后一行的命令 sed '5,7d' sed-demo.txt # 删除连续的行,例如删除从 5 到 7 行 的内容 sed '1d;5d;9d;$d' sed-demo.txt # 删除不连续的行,例如删除第1,第,第9和最后一行 sed '3,6!d' sed-demo.txt # 配合逻辑非 ! 使用,比如删除第 3到 6 行以外的其他行 sed '/^$/d' sed-demo.txt # 删除文件的空白行 sed '/System/d' sed-demo.txt # 删除包含特定字符的行 sed '/System\|Linux/d' sed-demo.txt # 文本中有 System 或 Linux 的行都要进行删除 sed '/^R/d' sed-demo-1.txt # 删除以某一个字符开头的行时,比如说删除以 R 开头的行 sed '/^[RF]/d' sed-demo-1.txt # 删除以R或者F开头的行 sed '/m$/d' sed-demo.txt # 删除以某一个字符结尾的行,比方说删除以m结尾的行 sed '/[xm]$/d' sed-demo.txt # 删除以x或m结尾的行 sed '/^[A-Z]/d' sed-demo-1.txt # 删除所有以大写字母开头的行,在A和Z中间加个-就可以了 sed '/[A-Za-z]/d' sed-demo-1.txt # 删除包含字母字符的行 sed '/[0-9]/d' sed-demo-1.txt # 删除包含数字的行 sed '/^$/d' file # 删除空白行 sed '2d' file # 删除第二行 sed '2,$d' file # 删除第二行到最后一行 sed '$d' file # 删除最后一行 sed '/^test/'d file # 删除开头为test的行 sed -i '2a\this is a test line' test.conf # 将this is a test line添加至第二行
# 替换目录下所有文件中的某字符串
---要将目录/modules下面所有文件中的zhangsan都修改成lisi -这个命令组合很强大,要注意备份文件 -grep操作主要是按照所给的路径查找zhangsan,/modules是所替换文件的路径; sed -i “s/zhangsan/lisi/g” grep zhangsan -rl /modules -i 表示inplace edit,就地修改文件 -r 表示搜索子目录 -l 表示输出匹配的文件名
---批量查找某个目下文件的包含的内容
grep -rn "要找查找的文本" ./
---批量查找并替换当前文件夹下的文件内容
sed -i "s/要找查找的文本/替换后的文本/g" `grep -rl "要找查找的文本" ./`
---批量查找并替换/data下的文件内容
sed -i "s/要找查找的文本/替换后的文本/g" `grep -rl "要找查找的文本" /data`
---替换所有文件中的某些内容
find -type f -name “*.sh” | xargs sed ‘s#oldboy#oldgril#g’-i;
sed 's#oldboy#oldgril#g' `find -type f -name "*.sh"`;
find -type f -name “*.sh” -exec sed ‘s#oldboy#oldgirl#g’ {} \;四. wc 计算字数
-c 或--bytes 或--chars 只显示 Bytes 数。
-l 或--lines 只显示行数。
-w 或--words 只显示字数。
--help 在线帮助。
--version 显示版本信息。
wc testfile # testfile 文件的统计信息
7 92 607 testfile # testfile 文件的行数为 7、单词数 92、字节数 607
五. xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。
---xargs 一般是和管道一起使用.
参数:
-a file 从文件中读入作为sdtin
-e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
-p 当每次执行一个argument的时候询问一次用户。
-n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
-t 表示先打印命令,然后再执行。
-i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
-r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
-s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数。
-L num 从标准输入一次读取 num 行送给 command 命令。
-l 同 -L。
-d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。
-x exit的意思,主要是配合-s使用。。
-P 修改最大的进程数,默认是1,为0时候为as many as it can ,这个例子我没有想到,应该平时都用不到的吧。
---使用-n指定单行输出的个数
-查询当前目录下所有的.txt文件,并输出到指定文件b.log(有换行)
find . -name *.txt | xargs -n 1 echo > /tmp/b.log
-查找当前目录下所有的.txt文件,并移动到指定的目录
-加-i 参数直接用 {}就能代替管道之前的标准输出的内容
find . -name *.txt | xargs -i cp -rf {} /tmp;
-批量下载文件
-url.txt都是需要下载的链接地址
cat url.txt | xargs wget -c
# 多行输入单行输出
cat test.txt | xargs
a b c d e f g h i j k l m n o p q r s t u v w x y z
# -n 选项多行输出
cat test.txt | xargs -n3
a b c
d e f
# d 选项可以自定义一个定界符
echo "nameXnameXnameXname" | xargs -dX
name name name name
# 结合 -n 选项使用
echo "nameXnameXnameXname" | xargs -dX -n2
name name
name name
# xargs 的一个选项 -I,使用 -I 指定一个替换字符串 {},这个字符串在 xargs 扩展时会被替换掉,当 -I 与 xargs 结合使用,每一个参数命令都会被执行一次
cat arg.txt | xargs -I {} ./sk.sh -p {} -l
# 复制所有图片文件到 /data/images 目录下
ls *.jpg | xargs -n1 -I {} cp {} /data/images
# 用 rm 删除太多的文件时候,用 xargs 去避免这个问题
find . -type f -name "*.log" -print0 | xargs -0 rm -f
--xargs -0 将 \0 作为定界符。
# 统计一个源代码目录中所有 php 文件的行数
find . -type f -name "*.php" -print0 | xargs -0 wc -l
# 查找所有的 jpg 文件,并且压缩它们
find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz
#假如你有一个文件包含了很多你希望下载的 URL,你能够使用 xargs下载所有链接
cat url-list.txt | xargs wget -c
六. split 命令进行大文件切割很方便
-b, --bytes=SIZE :对 file 进行切分,每个小文件大小为 SIZE 。可以指定单位 b,k,m 。
-l, --lines=NUMBER :对 file 进行切分,每个文件有 NUMBER 行。
prefix:分割后产生的文件名前缀。
split [-bl] file [prefix]
-要切分的文件为test.txt,大小1.2M,12081行。
split -l 5000 test.txt # 每个文件有5000行
split -b 600k test.txt # 每个文件大小600k
split -b 500k test.txt go # 得到三个文件,文件名的前缀都是 go
七. cat 命令进行多个小文件的合并
-n: #显示行号
-e: #以$字符作为每行的结尾
-t: #显示TAB字符(^I)
cat [-n] [-e] [-t] [输出文件名]
-合并文件
cat /data/users_* >users.sql
---grep 搜索字符串
grep ^root passwd #过滤以root开头的行
grep root$ passwd #过滤以root结尾的行
grep -i ^root passwd #不区分大小写,过滤以root结尾的行
grep -E "^root|root$" passwd #过滤以root开头或者以root结尾的行,-E表示扩展正则表达式
grep -E -v "^root|root$" passwd #-v表示反向过滤
grep -E -v "^root|root$" passwd | grep root #过滤root在中间的行
grep -i root passwd | grep -v -i -E "^root|root$" #过滤root在中间的行
grep 'r.t' test #过滤r和t之间只有一个字符
grep 'r..t' test #过滤r和t之间有二个字符
grep 'r...t' test #过滤r和t之间有三个字符
grep 'r*t' test #过滤r出现的任意次数
grep 'r\**t' test #过滤r,t之间有0个字符
grep 'ro*t' test #过滤r和t之间o出现的任意次数
grep -E 'ro*t' test #过滤r和t之间o出现的任意次数
grep -E 'ro?t' test #过滤r和t之间o出现的0和1次
grep -E 'ro{1,}t' test #过滤r和t之间o出现的1以上的次数
grep -E 'ro{,3}t' test #过滤r和t之间o出现的3以下的次数
---sed 行编辑器
/*显示*/
sed -n '^:/p' fstab #显示fstab中以:开头的行
sed -n 'UUID$/p' fstab #显示fstab中以UUID结尾的行
sed -n '/^UUID/p' fstab #显示fstab中以UUID开头的行
sed -n '2,6p' fstab #显示fstab中的第二和第六行
sed -n '2,6!p' fstab #显示fstab中除过第二和第六行其余的行
/*删除*/
sed '/^UUID/d' fstab #删除以UUID开头的行
sed '/^#/d' fstab #删除以#开头的行
sed '/^$/d' fstab #删除以空格开头的行
sed '/^UUID/!d' fstab #删除不是以UUID开头的行
cat -n fstab | sed '1,4d' #删除1到4行
cat -n fstab | sed -e '2d;6d' #删除第二行和第六行
/*添加*/
sed '/^UUID/a\hello' fstab #在以UUID开头的行的前一行添加hello
sed '/^UUID/a\hello \nwestos' fstab #在以UUID开头的行的前一行添加hello换行再添加westos
/*插入*/
sed '/^UUID/i\hello' fstab #在UUID的前一行添加hello
/*替换*/
sed 's/要被取代的字串/新的字串/g' #查找并替换
sed '/^UUID/c\hello' fstab #把以UUID开头的行替换成hello
/*其他操作*/
1 sed -n '/^UUID/=' fstab #显示以UUID开头的行号
2 sed -n -e '/^UUID/p' -e '/^UUID/=' fstab #-e用来连接''
3 sed '=' fstab | sed 'N' #N表示每行多加一个换行符
4 sed '=' fstab | sed 's/\n//g' #显示行号并换行
5 sed '=' fstab | sed 'N;s/\n/ /g' #显示行号不换行
6 sed 'G' fstab #每行加空行显示fstab中内容
7 sed '$!G' fstab #每行加空行但最后一行不加空行显示
8 sed -n '$p' fstab #显示文件的最后一行
9 sed 's/nologin/westos/g' passwd #把passwd中以nologin结尾的全部替换为westos
10 sed '3,5s/nologin/westos/g' passwd #用westos替换passwd中第三行到第五行的nologin
11 sed '/adm/,/sync/s/nologin/westos/g;s/sbin/wang/g' passwd #用westos替换以adm和sync开头
---awk 报告生成器(列操作)
awk '{print $1}' #打印第一列
awk 'BEGIN{ORS=","}{print $1}' #打印第一列并替换换行为逗号
awk -F ":" '{print $1}' passwd #以:为分隔符,显示第一列
awk -F ":" 'BEGIN{print "NAME"}{print $1}' passwd #以NAME开始显示第一列
awk -F ":" 'BEGIN{print "NAME"}{print NR$1}END{print "END"}' passwd #以NAME开始,以END结束,显示第一列并显示行号
awk -F ":" 'BEGIN{print "NAME"}{print NR;print }END{print "END"}' passwd #显示行号并换行
awk -F ":" '/bash$/{print $1}' passwd #sh结尾的行的第一列,$1表示第一列
awk -F ":" 'BEGIN{N=0}/bash$/{N++}END{print N}' passwd #统计passwd中以bash结尾的行数
awk '/^ro/{print}' passwd #打印以ro开头的行
awk '/^[^a-d]/{print}' passwd #打印以a到d开头的行
awk '/^a|nologin$/{print}' passwd #打印以a开头或者以nologin结尾的行
awk -F ":" '$1~/^r/{print}' passwd #打印以r开头的行
awk -F ":" '$1!~/^r/{print}' passwd #打印不以r开头的行
- $0:表示整个当前行
- $1:表示每行第一个字段
- $2:表示每行第二个字段
....以此类推
- NR:每行的记录号(行号)
- NF:每行的字段数
- FILENAME:正在处理的文件名
awk '{print $1}' filename # 打印文件的第一列(域)
awk '{print $1,$2}' filename # 打印文件的前两列(域)
awk '{print $1 $2}' filename # 打印完第一列,然后打印第二列
awk 'END{print NR}' filename # 打印文本文件的总行数
awk 'NR==1{print}' filename # 打印文本第一行
sed -n "2, 1p" filename | awk 'print $1' 打印文本第二行第一列