标签:linux bash 文本文件查找 正则2 sed awk
二. sed
格式 : sed ‘内容‘p -n 文件 打印某行 内容为英文用 / /括起来
sed ‘内容‘d 文件 打印除内容以外其他行
sed 不加-i 进行查看 加上-i 对源文件进行操作
-r 不需要脱义 ? + ( ) | 需要脱义
打印指定行 sed ‘10‘p -n 1.txt;
不加-n 会每行出现2次,打印第10行
sed ‘1,4‘p -n 1.txt;
1到4行
sed ‘5,$‘p -n 1.txt
5到末行
p为打印,d为删除
-n 静默模式,和p一起用。(只打印符合条件的行)
sed -n ‘/^\//p‘ /etc/fstab
a \字符串:在指定行后面追加新行
\n 可以换行
i \字符串:在指定行前面加新行
r 路径 指定的文件添加到查找到的行出
sed ‘1,3r /etc/passwd‘ /etc/fstab
用于文件合并
w 路径 将查找内容写入指定文件路径下
sed ‘1,5w /etc/123.txt‘ /etc/fstab
s/被查找内容/替换内容/ 默认替换是每行第一个
s/// s### s@@@
改
live-->liver
love-->lover
s/l..e/&r/g 被查找内容支持正则,但是替换内容不支持,只能用 & 代替前面查找的内容,后面加个r
s#\(l..e\)#\1r#g 后项引用
live-->Live
love-->Love
s#l\(..e\)#L\1#g 只能使用后项引用
sed -f /xssh/1.sh /etc/fstab
使用 shell文件 执行文件
sed -r
使用扩展正则
history |sed ‘s#^[[:space:]]##g‘ | cut -d ‘ ‘ -f1
将行首空白砍掉
/内部如果有字符与格式脱意冲突 需要 "\"/
打印包含某个字符串的行 sed -n ‘/root/‘p 1.txt
包含root的行
可以使用 ^ . * $等特殊符号-e 可以实现同时进行多个任务
sed -e ‘/root/p‘ -e ‘/body/p‘ -n 1.txt 也可以用;实现
sed ‘/root/p; /body/p‘ -n 1.txt
删除行 sed ‘/root/d‘ 1.txt;
删除带有root的行 ,不需要带 -n
sed ‘1d‘ 1.txt;
删第一行
sed ‘1,10d‘ 1.txt
删1到10行
替换 sed ‘1,2s/ot/to/g‘ 1.txt,
1、2行 ot 改为 to
其中s就是替换的意思,g为全局替换,否则只替换第一次的,
/也可以为 #, @ 等
sed ‘s/BASH/123/gi‘ 1.log
替换时候 加i 不区分大小写
删除所有数字 sed ‘s/[0-9]//g‘ 1.txt
删除所有非数字 sed ‘s/[^0-9]//g‘ 1.txt
head -n2 1.txt |sed ‘s/\(root\)\(.*\)\(bash\)/\3\2\1/‘
调换两个字符串位置
sed -r ‘s/(^.*)(:.*:)(\/.*$)/\3\2\1/g‘
sed -r ‘s#(^.#)(:.*:)(/.*$)#\3\2\1#‘
直接修改文件内容 sed -i ‘s/ot/to/g‘ 1.txt
sed练习题:
把/etc/passwd 复制到/root/test.txt,用sed打印所有行
sed -n ‘1,$p‘ test.txt
打印test.txt的3到10行
sed -n ‘3,10p‘ test.txt
打印test.txt 中包含 ‘root‘ 的行
sed ‘/root/p‘ -n test.txt
删除test.txt 的15行以及以后所有行
sed ‘15,$d‘ test.txt
删除test.txt中包含 ‘bash‘ 的行
sed ‘/bash/d‘ test.txt
替换test.txt 中 ‘root‘ 为 ‘toor‘
sed ‘s#root#toor#g‘ test.txt
替换test.txt中 ‘/sbin/nologin‘ 为 ‘/bin/login‘
sed ‘s#/sbin/nologin#/bin/login#g‘ test.txt
删除test.txt中5到10行中所有的数字
sed ‘5,10s#[0-9]##g‘ test.txt
删除test.txt 中所有特殊字符(除了数字以及大小写字母)
sed ‘s#[^0-9a-z]##g‘ 123
把test.txt中第一个单词和最后一个单词调换位置
sed -r ‘s#(^.*)(:.*:.*:.*:.*:.*:.*/.*/)(.*$)#\3\2\1#g‘ test.txt
bash:x:0:0:root:/root:/bin/root (最后一个单词与第一个调换)
sed -r ‘s#(^.*)(:.*:.*:.*:.*:.*:.*)(/.*/.*$)#\3\2\1#g‘ test.txt
/bin/bash:x:0:0:root:/root:root (最后的shell 与第一个单词调换)
sed ‘s#\(^.*\)\(:x:.*\)\(/.*$\)#\3\2\1#g‘ test.txt (使用脱意) -r 可以 省去脱意字符
把test.txt中出现的第一个数字和最后一个单词替换位置
sed -r ‘s#(^.*)([0-9])(.*/.*/.*/)(.*$)#\1\4\3\2#g‘ test.txt
sed -r ‘s#(^.*)([0-9])(.*/.*/.*/)(.*$)#\1\4\3\2#g‘ test.txt
把test.txt 中第一个数字移动到行末尾
sed -r ‘s#(^.*:)([0-9])(.*$)()#\1\4\3\2#g‘ 123
在test.txt 20行到末行最前面加 ‘aaa:‘
sed ‘20s/$/aaa/g‘ 123
AWK
截取文档中的某段 awk -F ‘:‘ ‘{print $1}‘ 1.txt
也可以使用自定义字符连接每个段 awk -F‘:‘ ‘{print $1"#"$2"#"$3"#"$4}‘ 1.txt
匹配字符或字符串 awk ‘/oo/‘ 1.txt
针对某个段匹配 awk -F ‘:‘ ‘$1 ~/oo/‘ 1.txt
多次匹配 awk -F ‘:‘ ‘/root/ {print $1,$3}; $1 ~/test/; $3 ~/20/‘ 1.txt
条件操作符==, >,<,!=,>=;<=
awk -F ‘:‘ ‘$3=="0"‘ 1.txt;
awk -F ‘:‘ ‘$3>="500"‘ 1.txt;
awk -F ‘:‘ ‘$7!="/sbin/nologin"‘ 1.txt;
awk -F ‘:‘ ‘$3<$4‘ 1.txt ;
awk -F ‘:‘ ‘$3>"5" && $3<"7"‘ 1.txt
awk -F ‘:‘ ‘$3>"5" || $7=="/bin/bash"‘ 1.txt
awk内置变量 NF(段数) NR(行数)
head -n3 1.txt | awk -F ‘:‘ ‘{print NF}‘
head -n3 1.txt | awk -F ‘:‘ ‘{print $NF}‘
head -n3 1.txt | awk -F ‘:‘ ‘{print NR}‘
打印20行以后的行awk ‘NR>20‘ 1.txt
awk -F ‘:‘ ‘NR>20 && $1 ~ /ssh/‘ 1.txt
更改某个段的值awk -F ‘:‘ ‘$1="root"‘ 1.txt
数学计算, 把第三段和第四段值相加,并赋予第七段 awk -F ‘:‘ ‘{$7=$3+$4; print $0}‘ 1.txt
计算第三段的总和 awk -F ‘:‘ ‘{(tot=tot+$3)}; END {print tot}‘ 1.txt
awk中也可以使用if关键词 awk -F ‘:‘ ‘{if ($1=="root") print $0}‘ 1.txt
awk -F ‘:’ ‘{print $1}‘ 1.log
按 : 分割 显示 第一列
print $0
显示所有
awk -F ‘:’ ‘$1~/root/‘ 1.log
第一列 匹配 root 显示所有列
{print NR}
显示个别列 NR为显示 行号
awk -F ‘:‘ ‘$3==0‘ 1.log
匹配第三段 是0的
>= 大于 等于
!= 不等于
$3<$4 符合这个比较项的
$3==$4 需要2个等号
1个等号 是赋值
$3==$4 && &1==$2 && 并且~
awk -F ‘:‘ ‘{print $NF}‘ 1.log
此时 NF 等于7
‘NR>20 && $NF !="/sbin/nologin" ‘
20行以后 并且 7列不等于
awk -F ‘:‘ ‘{(tot=tot+$3)}; END{print tot}‘ 1.log
将第三列 连续相加
awk -F ‘:‘ ‘{(if $1=="root") print $0}‘ 1.log
第一列 为 root 的行
awk -F ‘:‘ ‘$7=$3+$4‘ 1.log
第7列 等于 3 4 列相加
awk练习题
用awk 打印整个test.txt (以下操作都是用awk工具实现,针对test.txt)
查找所有包含 ‘bash‘ 的行
用 ‘:‘ 作为分隔符,查找第三段等于0的行
用 ‘:‘ 作为分隔符,查找第一段为 ‘root‘ 的行,并把该段的 ‘root‘ 换成 ‘toor‘ (可以连同sed一起使用)
用 ‘:‘ 作为分隔符,打印最后一段
打印行数大于20的所有行
用 ‘:‘ 作为分隔符,打印所有第三段小于第四段的行
用 ‘:‘ 作为分隔符,打印第一段以及最后一段,并且中间用 ‘@‘ 连接 (例如,第一行应该是这样的形式 ‘root@/bin/bash‘ )
用 ‘:‘ 作为分隔符,把整个文档的第四段相加,求和
本文出自 “你我同行” 博客,请务必保留此出处http://ondali.blog.51cto.com/6650368/1615965
标签:linux bash 文本文件查找 正则2 sed awk
原文地址:http://ondali.blog.51cto.com/6650368/1615965