Linux命令使用小记--grep, sed

「TRIGGER」  项目【2020新冠疫情实时监控】中,数据保存出现的问题。

「EXPERIENCE」

  一开始以为是数据保存端出现问题,以为是fscanf输入每行以空格分隔字段的文件导致的错误,并修改为以逗号分隔。不曾想修改程序后仍有错误数据保存发生,后经前辈提醒发现错误保存的那一条数据字段栏数匹配之前的数据,只是每个字段的内容有点微妙。

  进一步找原因的时候发现在有问题的那一条数据产生时,会提示"标准输入匹配到二进制文件"。于是本该有4个字段的数据文件因为这个原因导致生成的数据文件就只有一个date +"%s"的unix时间。随后c程序中定义的结构也没有初始化,导致fscanf读入的字段只有一个,而后面有五个错误数据就这样产生了。(还不够深入)

 【图片描述:提示标准输入匹配到二进制文件】

 

 【图片描述:错误数据产生原因】

 

  问题:“标准输入匹配到二进制文件”这一句是谁提示的,具体哪个命令遇到什么情况会提示?

 

  上网查阅后推测,类似提示语句的命令来源为:grep

  

  想起自己的数据筛选中好像源数据确实有经过grep筛选

  

  改进:grep -a "$head".

  结果:抱着终于搞定了的心态运行了一段时间.. 又出现了问题,程序卡死了

  想起昨天好像也遇到过,但自己那时候居然给无视了...

  

  遂再次请教前辈,前辈指出可能是源数据中有中文的原因。

  

 

 

  

  改进

cat ${stream[$step]} LC_ALL=C grep -a | LC_ALL=C sed "s/^.*${head}"/${head}/g"

  结果:前辈要有心理准备...不一定有效测试中...

 

 

  问题:LC_ALL=C 能作用多长时间?sed前的LC_ALL=C是否重复了?导管会不会重置环境变量?环境变量的作用范围?

 

「 分支点(新产生的问题)」什么是"C"?

「 分支点」什么是POSIX -> 待填...

 

「 分支点」环境变量的作用范围 -> 待填...  

 

「 分支点」子shell 父shell -> 待填...

  

 

「其他零碎的」

  文件命名不能用的符号 / : * " < > | ?

  grep: Globally search a Regular Expression and Print

  grep后加单引号(全引用,无变量替换),双引号(部分引用,将解释变量),不加引号(会解释变量, 但不能有空格)。

  不加export命令设置的环境变量只在本shell生效,加上export命令设置的环境变量不仅对本shell生效,对其子shell也生效。

  字符编码: UTF-8(国际通用,英文一个字节,中文三个字节), GBK(国家编码,涵盖所有中文。中英文均双字节), GB2312(GBK的基础) 

  

「参考资料」

  骏马金龙@博客园 https://www.cnblogs.com/f-ck-need-u/p/7499309.html  

  wajika@博客园 https://www.cnblogs.com/wajika/p/6592659.html 

  幻想之渔@CSDN https://blog.csdn.net/lmb1612977696/article/details/93715064 

原文地址:https://www.cnblogs.com/shuuei/p/12276112.html