find & grep & sed & wc & xargs & split & cat Linux教程


# 查看文件内容

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  
done

7. 统计Nginx访问日志,访问量排在前20 的 ip地址:

cat access.log |awk '{print $1}'|sort|uniq -c |sort -nr |head -20

8.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-20

11.写一个脚本查找最后创建时间是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 -10

14.替换文件中的目录

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'     打印文本第二行第一列


签名:这个人很懒,什么也没有留下!
最新回复 (0)
返回