sed常见命令
cat test.txt
101,henan,zhengzhou
102,shandong,jinan
103,anhui,hefei
104,shangdong,qingdao
101,henan,zhengzhou
102,shandong,jinan
103,anhui,hefei
104,shangdong,qingdao
a,全局替换(s###g)
1,对关键字进行匹配替换
- ]# sed -r ‘s#henan#Henan#g’ test.txt #将文档中得henan字符替换为Henan。
]# sed -r 's#henan#Henan#g' test.txt
101,Henan,zhengzhou
102,shandong,jinan
103,anhui,hefei
104,shangdong,qingdao
105,Henan,zhengzhou
106,shandong,jinan
107,anhui,hefei
108,shangdong,qingdao
2,向行首添加字符
- sed ‘s#^#zhongguo &#g’ test.txt (向行首添加字符)
- awk -F’[ #]+’ ‘{print $2,$3,$4}’ test.txt (可以用这条命令恢复)
]# sed 's#^#zhongguo &#g' test.txt
zhongguo 101,henan,zhengzhou
zhongguo 102,shandong,jinan
zhongguo 103,anhui,hefei
zhongguo 104,shangdong,qingdao
zhongguo 105,henan,zhengzhou
zhongguo 106,shandong,jinan
zhongguo 107,anhui,hefei
zhongguo 108,shangdong,qingdao
zhongguo zhongguo,beijing,tiananmen
zhongguo 110,shanghai,minhang
zhongguo
zhongguo #welcome to henan
3,行尾添加字符
- ]# sed ‘s#$#,beijing#g’ test.txt (向行尾添加字段",beijing")
]# sed 's#$#,beijing#g' test.txt
101,henan,zhengzhou,beijing
102,shandong,jinan,beijing
103,anhui,hefei,beijing
104,shangdong,qingdao,beijing
105,henan,zhengzhou,beijing
106,shandong,jinan,beijing
107,anhui,hefei,beijing
108,shangdong,qingdao,beijing
zhongguo,beijing,tiananmen,beijing
110,shanghai,minhang,beijing
,beijing
#welcome to henan,beijing
1212,beijing
b,打印指定行或指定范围的行(指定行到结尾)
1, 打印指定行
sed -n ‘3p’ test.txt
]# sed -n '3p' test.txt
103,anhui,hefei
2,按行的范围打印
sed -n ‘3,5p’ test.txt
]# sed -n '3,5p' test.txt
103,anhui,hefei
104,shangdong,qingdao
105,henan,zhengzhou
3,打印指定行到最后一行
sed -n ‘7,$p’ test.txt
]# sed -n '7,$p' test.txt
107,anhui,hefei
108,shangdong,qingdao
zhongguo,beijing,tiananmen
110,shanghai,minhang
c,过滤
1, 按关键字匹配
sed -n ‘/henan/p’ test.txt
]# sed -n '/henan/p' test.txt
101,henan,zhengzhou
105,henan,zhengzhou
2,按关键字范围进行匹配 (可以应用于日志查找)
sed -n ‘/103/,/107/p’ test.txt
]# sed -n '/103/,/107/p' test.txt
103,anhui,hefei
104,shangdong,qingdao
105,henan,zhengzhou
106,shandong,jinan
107,anhui,hefei
此案例可以应用查看日志方面 比如:过滤nginx日志
- sed -n ‘/10:14:21/p’ nginx.log
- sed -n ‘/10:13:21/,/12:30:21/p’ nginx.log
sed命令的那些事
表示范围过滤的时候,如果结尾的内容匹配不到,就是一直显示到末尾
3,过滤空行
]# sed -n ‘/^$/!p’ test.txt
d, 删除
-d 选项
1, 删除指定行
sed ‘3d’ test.txt #删除第三行
]# sed '3d' test.txt
101,henan,zhengzhou
102,shandong,jinan
104,shangdong,qingdao
105,henan,zhengzhou
106,shandong,jinan
107,anhui,hefei
108,shangdong,qingdao
zhongguo,beijing,tiananmen
110,shanghai,minhang
2, 删除空行、注释行
- ]# sed -r ‘/^$|#/d’ test.txt #删除空行、注释行
- ]# egrep -v ‘^$|#’ test.txt #删除空行、注释行
- ]# sed -nr ‘/^$|#/!p’ test.txt #删除空行、注释行
]# sed -r '/^$|#/d' test.txt
101,henan,zhengzhou
102,shandong,jinan
103,anhui,hefei
104,shangdong,qingdao
105,henan,zhengzhou
106,shandong,jinan
107,anhui,hefei
108,shangdong,qingdao
zhongguo,beijing,tiananmen
110,shanghai,minhang
]# egrep -v '^$|#' test.txt
101,henan,zhengzhou
102,shandong,jinan
103,anhui,hefei
104,shangdong,qingdao
105,henan,zhengzhou
106,shandong,jinan
107,anhui,hefei
108,shangdong,qingdao
zhongguo,beijing,tiananmen
110,shanghai,minhang
3,删除匹配行
]# sed ‘/1212/d’ test.txt (删除匹配项1212所在的行)
4,删除最后一行
]# sed ‘$d’ test.txt
e, cai操作
- c replace 替换这一行的内容
- a append 追加,向指定的行或每一行追加内容(行后面)
- i insert 插入,向指定的行或每一行插入内容(行前面)
1,追加 -指定行追加,最后一行追加
-
]# sed ‘11a 112,henan,UFO’ test.txt #向第11行后添加一行
-
]# sed ‘$a test’ test.txt (向最后一行追加一行内容)
关于windows、linux 系统下换行符的问题
在Unix系统里,每行结尾只有"<换行>“,即“\n”;
在windows系统里,每行结尾是”<换行><回车>“,即”\n\r";
直接后果就是Unix系统下的文件在Windows里打开的话,所有文字会变成一行;
Windows里的文件在Unix下打开的话,在每行的结尾可能会多出一个^M符号。
cat -A test.txt
那么问题来了,在unix系统中怎么去消除这个问题
要把文件转换一下,有两种方法:
1.命令dos2unix test.file
2.去掉"\r" ,用命令sed -i ‘s/\r//’ test.file
命令p输出:
命令 | 完整示例 | 说明 |
---|---|---|
p | sed -n ‘p’ test.txt | 输出文档所有行 |
2p | sed -n ‘2p’ test.txt | 输出文档第二行 |
2,5p | sed -n ‘2,5p’ test.txt | 输出文档的第二行到第五行 |
2,+5p | sed -n ‘2,+5p’ test.txt | 输出第二行(包括第二行)后面的五行内容 |
1~2p | sed -n ‘1~2p’ test.txt | 输出第一行,步长2,输出文档中的奇数行 |
2~2p | sed -n ‘2~2p’ test.txt | 输出第二行,步长为2,输出文档中的偶数行 |
/正则/p | sed -n ‘/^【0-9】/p’ test.txt | 输出以数字开头的行 |
$= | sed -n ‘$=’ test.txt | 输出文档的行数 |
命令d 删除
命令 | 完整示例 | 说明 |
---|---|---|
2d | sed ‘2d’ test.txt | 删除test.txt 文档中的第二行 |
2,5d | sed ‘2,5d’ test.txt | 删除test.txt文档中的第二行至第五行的内容 |
2,+5d | sed ‘2,+5d’ test.txt | 删除test.txt文档中的第二行以及后面的五行内容 |
$d | sed ‘$d’ test.txt | 删除test.txt文档中的最后一行 |
/正则/ | sed ‘/^【0-9】/d’ test.txt | 删除test.txt 文档中以数字开头的行 |
//!d | sed ‘/^【0-9】/d’ test.txt | 删除test.txt 文档中非数字开头的行 |
^$ | sed ‘^$’ test.txt | 删除test.txt 文档中的空行 |
命令s替换
命令 | 完整示例 | 说明 |
---|---|---|
s#old#new# | sed ‘s#old#new#’ test.txt | 将test.txt文档中每行中的第一个old字符替换成new |
s#old#new#2 | sed ‘s#old#new#2’ test.txt | 将test.txt文档中每行中的第二个old字符替换成new |
s#old#new#g | sed ‘s#old#new#g’ test.txt | 将test.txt文档中每个old字符替换成new |
s#old## | sed ‘s#old##’ test.txt | 将test.txt文档中每行中的第一个old字段替换为空也既是删掉 |
s#henan#&s# | sed ‘s#henan#&s#’ test.txt | 将test.txt 文档中的每一行中的第一个henan替换成henans 其中&代表匹配的字符 |
4,7s/^/#/ | sed ‘4,7s/^/#/’ test.txt | 将test.txt 文档中的第4行至第7行注释掉 |
4,7s/^/#/ | sed ‘4,7s/^#henan/henan/’ test.txt | 将test.txt 文档中的第4行至第7行中以henan开头的行取消注释 |
cai插入
命令形式 | 完整示例 | 说明 |
---|---|---|
行号i | sed ‘2i 123’ test.txt | 将123插入test.txt 文档中的第二行前面 |
正则i | sed ‘/^【0-9】/i 123’ test.txt | 将123插入到test.txt 文档中以数字开头的行前面 |
正则i | sed ‘/^102/i123’ test.txt | 将123插入到test.txt 文档中以数字102开头的行前面 |
a | 在行后面插入 | 命令格式和i相同 |
c | 替换改行 | 命令格式和i相同 |
$a | sed '$a test ’ test.txt | 向文档test.txt 最后一行追加一行内容为test |
行号a | sed ‘11a 112,henan,UFO’ test.txt | 在test.txt 文档中,向第11行后面追加一行 |