1 Star 0 Fork 11

coder_lw / wiki

forked from deepinwiki / wiki 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
linux字符串处理.md 4.21 KB
一键复制 编辑 原始数据 按行查看 历史
htqx 提交于 2020-02-17 16:06 . 新增几个常用软件

[TOC]

linux 字符串处理

前言

字符串(文本)处理为什么值得拿出来说一下?事实上,字符串的处理是编程开发中非常重要的处理对象。我们日常面对的很多东西实际上都是文本处理,其次才是图像,音频。图像音频这些相对来说比较专业,比较小众。但字符串处理可以说涉及到方方面面,各种领域。

尤其在linux中。如果你听说过一句,linux什么都是文件,其次,也可以说linux处处皆文本。linux世界中是很反对二进制的,因为二进制是不开放的,难以被其他程序员对接起来,而文本是开放的,只要有个文本编辑器,你就可以修改应用的配置。

因此,字符串处理,在linux中可以说是非常通用的一门技能,只要能处理好文本,你就可以对接大量的命令,可以处理他们的文本输出,修改它们的配置,进行整合形成一组可执行的功能强大的脚本。

即便你不是专业的程序员。

工具的组合运用

linux 中有着著名的文本处理三剑客,grep,sed,awk。这三剑客功能强大,学习难度也高,但是他们值得你学习。而一些相对比较简单的工具,某些时候也可以结合起来,也能展现强大的表达能力。

单个命令,多少有些无趣,但是整合起来就非常有意思。应该把重点放在如何整合运用之上,而不应该单独去使用他们,那样太枯燥。

下面介绍出场运动员:

  1. cut :分割。-d可以指定分隔符,--output-delimiter和输出的分隔符,-f输出的列,但无法处理重复的分隔符
  2. sort : 多行排序。可识别数字,大小写字母,时间,容量。-R可打乱次序,-r逆序,-u去重,-k指定排序的列。
  3. uniq : 去重相邻行。-c计算重复数,-d查询重复行,-u查询无重复行
  4. wc : 统计。-l行数,-c字节数,-w单词数,-m字符数
  5. join: 根据关键字连接两组字符串
  6. comm: 将两组排序的字符串合并为三列,第一列为第一组独有的行,第二列为第二组独有的行,第三列为公共行

例子:

观察/etc/passwd 文件,这个保存帐号的文件,不同的帐号貌似有几种不同的登录 shell,不妨根据 shell 的不同来分类输出一下相关的帐号。

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
……等
# 输出第1列和第7列
# 即root:/bin/bash
cut -d":" -f1,7 /etc/passwd 
# 根据shell列排序
# sort的分隔符是空格,所以cut要改变输出分隔符
cut -d":" -f1,7 --output-delimiter=" " /etc/passwd | sort -k 2
# 同一种shell有多少个账户
cut -d":" -f7 /etc/passwd | sort | uniq -c
# 整合,并调整排版
join -1 2 -2 2 -o 1.1,1.2,2.1 <(cut -d":" -f7 /etc/passwd | sort | uniq -c) <(cut -d":" -f1,7 --output-delimiter=" " /etc/passwd | sort -k 2)

通过层层递进, 利用管道来融合多组命令,最终达到我们想要的效果。

例子二:

我们知道,一个程序要运行,并非只有命令本身即可,它实际上还是会依赖相关的库文件。假设我们要拷贝一个命令到另一台电脑,就应该把相关的库文件一并拷贝过去。这对于简单的命令是可行的,复杂的程序它还会依赖各种数据和配置。

比如,/bin/ls这个程序,我们可以通过ldd这个命令查询它依赖的库:

# 查询依赖的库
ldd /bin/ls
# 输出:
	linux-vdso.so.1 (0x00007ffe4e12e000)
	libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f61c573a000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f61c5579000)
	libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f61c5505000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f61c5500000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f61c57b5000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f61c54df000)

我们能不能够从这个信息中提取相关依赖文件,并进行自动化的打包呢?

相关命令的选项

cut

sort

uniq

wc

join

comm

参考

  1. sort : https://www.computerhope.com/unix/usort.htm d
1
https://gitee.com/coder_lw/wiki.git
git@gitee.com:coder_lw/wiki.git
coder_lw
wiki
wiki
master

搜索帮助