Linux 文本相关命令(1)
前言
最近线上环境(Windows Server)出现了一些问题,需要分析一下日志。感觉 Windows 下缺少了一些 Linux 系统中的小工具,像在这波操作中用到的 grep、sort、uniq、awk 这些,本文简单梳理回顾下鄙人在使用这些工具中的一些小技巧和遇到的坑。当然,由于开发的机器都是 Windows,因此使用 Docker Desktop 环境运行 Linux 镜像,并且使用共享文件夹的方式以共享数据。
1. Docker 镜像中的编码问题
在共享文件夹(Windows 中为 d:\docker-share,容器中为 /shared-windows)中新建一个名为 “Overwatch守望先锋” 的文本文件,并在其中写入 “You are powered up,get in there! 你被强化了,快送!”
需要注意的是,在鄙人现在的 Windows 系统(Windows 10 专业版 2004)的记事本中,保存时默认编码为 UTF-8。由于暂时没有其它系统,因此不再考虑其它编码格式的影响。
首先运行官方的 ubuntu 镜像,cd 到 /shared-windows 目录下,查看当前目录下的所有文件:
可以看到由于文件名是中文,无法正确的显示(比较奇怪的是,此时使用 cat 命令可以正确的看到文本中的中文)。
解决方法:
docker exec 时使用 env LANG=C.UTF-8 以 指定编码格式
如:
可以看到文件列表已经可以正常展示了。
注意事项
(1) 网络上还有其它案例讲使用 LANG=C.UTF-8,并执行 source /etc/profile ,鄙人试验后没有成功。
(2) 如果是自己构建镜像,当然可以将上述命令添加到 Dockerfile 中,起到同样的效果。
(3) 显示中文应该只能在 Ubuntu, CentOS 这些操作系统类镜像中配置,在 busybox 这种工具镜像中不能实现(因为根本没有其它语言和编码啊QAQ)
2. grep 命令查看前后几行
在文件夹中新建一个名为 grep_test.txt 的文件,里面用随便打几行数字,并在较中间的一行加入字母A:
root@756adc85c954:/shared-windows# cat grep_test.txt
123123123123
6745686578756
45665436
345645A7678987 # 此行加入字母 A
24523525443546786578
5796789780890
34352353466
8907980
使用grep命令可以找到日志中对应的报错位置,如果想查看报错的前后都发生了什么,可以使用 grep -C + 数字 + 要查找的字符串,如:
root@756adc85c954:/shared-windows# cat grep_test.txt | grep -C 1 A
45665436
345645A7678987
24523525443546786578
查看字母 A 所在行的前后两行。
3. uniq 命令的小坑
在文件夹中新建一个名为 uniq_test.txt 的文件,里面每行依次用 123456 、ABCDEFG、123456、123456、ABCDEFG 填充:
root@756adc85c954:/shared-windows# cat uniq_test.txt
123456
ABCDEFG
123456
123456
ABCDEFG
尝试使用 uniq 命令去除重复行,可以看到 uniq 命令并未正确去重,因为 uniq 是去除的连续的重复:
root@756adc85c954:/shared-windows# cat uniq_test.txt | uniq
123456
ABCDEFG
123456
ABCDEFG
应当先使用 sort 命令排序后再使用 uniq 命令去重,如:
root@756adc85c954:/shared-windows# cat uniq_test.txt | sort | uniq
123456
ABCDEFG
参考
Docker 容器中显示中文 https://blog.csdn.net/gao449812984/article/details/83377132
grep 显示前后几行 https://www.cnblogs.com/noxy/p/11127678.html
uniq 的一些使用技巧 https://www.cnblogs.com/lovychen/p/5639753.html