当前位置:K88软件开发文章中心网站服务器框架Shell → 文章内容

Shell 字符串操作

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-23 14:39:35

第一个文件的第一列和第二个文件的第一列,这样就得到了我们要的结果,不过,可惜的是,这个结果并不准确,再进行下面的操作,你就会发现:$ cat /etc/passwd | sort -t":" -n -k 4 > /tmp/passwd$ cat /etc/group | sort -t":" -n -k 3 > /tmp/group$ join -o 1.1,2.1 -t":" -1 4 -2 3 /tmp/passwd /tmp/grouphalt:rootoperator:rootroot:rootshutdown:rootsync:rootbin:bindaemon:daemonadm:admlp:lppop:popnobody:nogroupfalcon:usersgames:users可以看到这个结果才是正确的,所以以后使用 join 千万要注意这个问题,否则采取更保守的做法似乎更能保证正确性,更多关于文件连接的讨论见参考后续资料。上面涉及到了处理某格式化行中的指定列,包括截取(如 SQL 的 select 用法),连接(如 SQL 的 join 用法),排序(如 SQL 的 order by 用法),都可以通过指定分割符来拆分某个格式化的行,另外,“截取”的做法还有很多,不光是 cut,awk,甚至通过 IFS 指定分割符的 read 命令也可以做到,例如:$ IFS=":"; cat /etc/group | while read C1 C2 C3 C4; do echo $C1 $C3; done因此,熟悉这些用法,我们的工作将变得非常灵活有趣。到这里,需要做一个简单的练习,如何把按照列对应的用户名和用户 ID 转换成按照行对应的,即把类似下面的数据:$ cat /etc/passwd | cut -d":" -f1,3 --output-delimiter=" "root 0bin 1daemon 2转换成:$ cat aroot bin daemon0 1 2并转换回去,有什么办法呢?记得诸如 tr,paste,split 等命令都可以使用。参考方法:正转换:先截取用户名一列存入文件 user,再截取用户 ID 存入 id,再把两个文件用 paste -s 命令连在一起,这样就完成了正转换逆转换:先把正转换得到的结果用 split -1 拆分成两个文件,再把两个拆分后的文件用 tr 把分割符 \t 替换成 \n,只有用 paste 命令把两个文件连在一起,这样就完成了逆转换。参考资料《高级 Bash 脚本编程指南》之操作字符串,之指定变量的类型《Shell十三问》之$(())与$()还有${}差在哪?Regular Expressions - User guideRegular Expression TutorialGrep TutorialSed Tutorialawk Tutorialsed TutorialAn awk Primer一些奇怪的 UNIX 指令名字的由来磨练构建正则表达式模式的技能基础11:文件分类、合并和分割(sort,uniq,join,cut,paste,split)使用 Linux 文本工具简化数据的提取SED 单行脚本快速参考(Unix流编辑器)后记这一节本来是上个礼拜该弄好的,但是这些天太忙了,到现在才写好一个“初稿”,等到有时间再补充具体的范例。这一节的范例应该是最最有趣的,所有得好好研究一下几个有趣的范例。写完上面的部分貌似是 1 点多,刚 check 了一下错别字和语法什么的,再添加了一节,即“字符串的存储结构”,到现在已经快 half past 2 啦,晚安,朋友们。26 号,添加“子串进制转换”和“子串编码转换”两小节以及一个处理 URL 地址的范例。

上一页  [1] [2] [3] [4] [5] 


Shell 字符串操作