当前位置: 首页 > news >正文

个人用云计算学习笔记 --21(Linux 文本处理工具与正则表达式)

文章目录

  • Linux 文本处理工具与正则表达式
    • 一、Linux 正则表达式
      • (一)核心元字符与功能
        • 1. 字符集匹配
        • 2. 通用匹配与转义
        • 3. 逻辑与限定匹配
        • 4. 定位与边界匹配
        • 5. 子表达式与反向引用
        • 6. 非打印字符匹配
    • 二、grep 命令
      • (一)基础语法
      • (二)核心选项分类与用法
        • 1. 模式选择与解释(控制正则表达式类型)
        • 2. 输出控制(控制匹配结果的显示形式)
        • 3. 查找文件(控制文件 / 目录的搜索范围)
        • 4. 上下文控制(显示匹配行的前后内容)
    • 三、sed 命令
      • (一)工作流程
      • (二)基础语法
      • (三)核心选项
      • (四)核心操作命令
        • 1. 打印(`p`/`P`)
        • 2. 删除(`d`/`D`)
        • 3. 替换(`s`/`c`)
        • 4. 插入(`i`/`a`)
        • 5. 保持空间操作(`h`/`H`/`g`/`G`)
        • 6. 其他常用命令
    • 四、awk 命令
      • (一)工作流程
      • (二)基础语法
      • (三)核心选项
      • (四)核心内置变量
      • (五)核心功能与示例
        • 1. 模式匹配(`pattern`部分)
        • 2. 动作处理(`action`部分)
          • (1)变量与计算
          • (2)循环语句
          • (3)数组
          • (4)函数
          • (5)格式化输出(`printf`)
        • 3. 输入输出重定向
    • 五、工具对比与适用场景

Linux 文本处理工具与正则表达式

一、Linux 正则表达式

正则表达式是由普通字符(大小写字母、数字、标点等可打印 / 不可打印字符)和元字符(特殊功能字符)组成的文字模式,用于匹配字符串,支持vimgrepPerlPython等工具与编程语言,分为普通正则表达式(基础元字符)和扩展正则表达式(支持更多元字符,需用egrepgrep -E调用)。

(一)核心元字符与功能

1. 字符集匹配

用于限定匹配的字符范围,精准筛选目标字符。

元字符功能示例
[...]匹配集合内任意一个字符c[ab]t匹配catcbt(匹配c后接a/b再接t
[^...]匹配除集合内字符外的所有字符c[^ab]t匹配c1tc-t(排除a/b
[a-z]/[A-Z]/[0-9]分别匹配小写字母、大写字母、数字c[a-z]t匹配catcbtc[0-9]t匹配c1t
[-a-zA-Z0-9]匹配-、字母、数字(-需放集合首位)c[-a-zA-Z0-9]t匹配catc-tc1tcCt
预定义字符集简化常用范围,格式[[:xxx:]]- [[:digit:]]:等效[0-9](数字)- [[:lower:]]:等效[a-z](小写字母)- [[:alnum:]]:等效[a-zA-Z0-9](字母数字)- [[:punct:]]:匹配所有标点(如!@#$%^&*
2. 通用匹配与转义

处理 “任意字符” 或 “元字符转义”,解决特殊字符匹配问题。

元字符功能示例
.匹配除换行符外的任意单个字符c.t匹配catc1tc-tc.Ct
\转义符:将元字符转为原义字符- c\.t匹配c.t(转义.,避免其作 “任意字符”)- \n匹配换行符,\\匹配\
3. 逻辑与限定匹配

控制匹配的逻辑选择(二选一)和重复次数,满足复杂场景。

元字符功能示例
``二选一匹配(扩展正则,需egrep/grep -E`catdog匹配catdog`
*匹配前面子表达式 0 次及以上do*g匹配dg(0 个o)、dog(1 个o)、doog(2 个o
+匹配前面子表达式 1 次及以上(扩展正则)do+g匹配dogdoog(排除dg
?匹配前面子表达式 0 次或 1 次(扩展正则)do?g匹配dgdog(排除doog
{m}匹配前面子表达式 exactly m次(扩展正则)do{2}g仅匹配doog(2 个o
{m,n}匹配前面子表达式m-n次(扩展正则)do{2,3}g匹配doog(2 个o)、dooog(3 个o
{m,}匹配前面子表达式至少m次(扩展正则)do{2,}g匹配doogdooogdoooog
{,n}匹配前面子表达式最多n次(扩展正则)do{,3}g匹配dgdogdoogdooog(排除 4 个o
4. 定位与边界匹配

限定匹配的位置(行首 / 行尾、单词边界),避免歧义。

元字符功能示例
^匹配行首^cat匹配以cat开头的行(如cat,排除acat
$匹配行尾cat$匹配以cat结尾的行(如catacat
\b匹配单词边界(单词与空格 / 符号的间隔)- \bcat匹配 “hello cat” 中的cat(排除category)- cat\b匹配 “acat”“hello cat” 中的cat(排除category)- \bcat\b仅匹配独立单词cat(如cat、“hello cat”)
\B非单词边界匹配\Bcat匹配acatconcatenate中的cat(排除独立cat
</>分别匹配单词左 / 右边界- <cat匹配 “cat”“category” 中的cat(左边界)- cat>匹配 “cat”“acat” 中的cat(右边界)
5. 子表达式与反向引用

通过分组和引用,实现复杂模式匹配(如重复字符串)。

元字符功能示例
()标记子表达式(分组),匹配结果存入临时缓冲区(dog){2}匹配dogdog(2 个dog);(dog){2,3}匹配dogdogdogdogdog
\N反向引用:引用第N个缓冲区的子表达式(N为 1-99)- egrep -o '\b([a-z]+)\1\b'匹配 “of of”“up up”(重复单词)- egrep -o '(laoma)(laoniu).*\1'匹配 “laoma laoniu laohu laoma”(引用第一个子表达式laoma
6. 非打印字符匹配

处理终端不显示的字符(如换行、制表符)。

元字符功能示例
\n匹配换行符grep '\n' file(需特殊处理换行符场景)
\t匹配制表符grep 'cat\t' file匹配 “cat ”(cat后接制表符)
\r匹配回车符grep '\r' file处理 Windows 格式文件的回车符
\s匹配任意空白字符(空格、制表符、换页符等)grep 'c\st' file匹配c t(空格)、c\t t(制表符)
\w匹配字母、数字、下划线(等效[a-zA-Z0-9_]grep '\w*t' file匹配cat123t_t
\W匹配非单词字符(等效[^a-zA-Z0-9_]grep '\Wt' file匹配-t@t

二、grep 命令

grep是 Linux 文本处理 “三剑客” 之一,核心功能是从文本文件或管道数据流中筛选匹配的行及数据,擅长快速过滤,支持正则表达式。

(一)基础语法

过滤管道数据流:command | grep [OPTION]… PATTERNS
例:cat words | grep ‘cat’(从cat words的输出中筛选含cat的行)
过滤文件:grep [OPTION]… PATTERNS [FILE]…
例:grep ‘cat’ words(从words文件中筛选含cat的行)

(二)核心选项分类与用法

1. 模式选择与解释(控制正则表达式类型)
选项功能示例
-E/--extended-regexp支持扩展正则表达式(等效egrepgrep -E '(dog){2}' words(匹配dogdog
-F/--fixed-stringsPATTERNS视为普通字符串(不解析元字符)grep -F 'c.t' words(仅匹配c.t,不匹配cat
-P/--perl-regexp支持 Perl 风格正则表达式grep -P '\bcat\b' words(Perl 风格单词边界)
-e PATTERN指定多个匹配模式(多-e联用)grep -e 'cat' -e 'dog' words(匹配catdog
-f FILE从文件读取匹配模式(每行一个模式)1. echo -e 'cat\ndog' > pattens.txt(创建模式文件)2. grep -f pattens.txt words(从文件读取模式)
-i/--ignore-case忽略大小写匹配grep -i 'CBT' words(匹配cbt
-w/--word-regexp仅匹配整个单词(等效\b...\bgrep -w 'cat' words(匹配cat、“hello cat”,排除category
-X/--line-regexp仅匹配整行(需行内容与模式完全一致)grep -X 'cat' words(仅匹配内容为cat的行)
2. 输出控制(控制匹配结果的显示形式)
选项功能示例
-v/--invert-match反向匹配:显示不匹配的行`grep -v '^d
-c/--count仅显示匹配行的数量grep -c 'dog' words(统计含dog的行数)
-n/--line-number显示匹配行的行号grep -n 'cat' words(输出 “1:cat”“2:category”)
-o/--only-matching仅显示匹配的内容(不显示整行)grep -o 'cat' words(仅输出cat,不输出行内其他内容)
-q/--quiet静默模式:无任何正常输出(用$?判断结果)1. grep -q 'dog' words(无输出)2. echo $?(匹配成功返回0,失败返回1
-b/--byte-offset显示匹配内容在该行的字节偏移量grep -b 'cat' words(输出 “0:cat”“4:category”,0为字节偏移)
--color[=WHEN]高亮显示匹配内容(WHENalways/never/autogrep --color 'cat' wordscat部分高亮)
3. 查找文件(控制文件 / 目录的搜索范围)
选项功能示例
-r/--recursive递归搜索目录(处理子目录文件)grep -r 'SELINUX=' /etc(递归搜索/etc下含SELINUX=的文件)
-R/--dereference-recursive递归搜索并跟随软链接grep -R 'SELINUX=' /etc(处理软链接指向的文件)
-h/--no-filename不显示匹配行所在的文件名grep -h 'cat' file1 file2(仅输出匹配行,不输出file1/file2
-H/--with-filename显示匹配行所在的文件名(默认,多文件时生效)grep -H 'cat' file1 file2(输出 “file1:cat”“file2:acat”)
-l/--files-with-matches仅显示含匹配模式的文件名grep -r -l 'SELINUX=' /etc(仅输出含SELINUX=的文件路径)
-L/--files-without-match仅显示不含匹配模式的文件名grep -r -L 'SELINUX=' /etc(仅输出不含SELINUX=的文件路径)
--include=GLOB仅搜索匹配GLOB模式的文件grep -r --include='*.conf' 'SELINUX=' /etc(仅搜索.conf文件)
--exclude=GLOB排除匹配GLOB模式的文件grep -r --exclude='*.log' 'SELINUX=' /etc(排除.log文件)
4. 上下文控制(显示匹配行的前后内容)
选项功能示例
-B NUM/--before-context=NUM显示匹配行及前NUM`ip addrgrep ‘10.1.8.88’ -B 2(显示10.1.8.88` 行及前 2 行)
-A NUM/--after-context=NUM显示匹配行及后NUM`ip addrgrep ‘ens32:’ -A 2(显示ens32:` 行及后 2 行)
-C NUM/--context=NUM显示匹配行及前后NUM行(等效-NUM`ip addrgrep ‘10.1.8.88’ -C 2(显示10.1.8.88` 行及前后 2 行)

三、sed 命令

sed(Stream Editor,流编辑器)是 Linux “三剑客” 之一,核心功能是非交互式修改文本(替换、删除、插入、打印等),基于 “模式空间(pattern space)” 和 “保持空间(hold space)” 处理数据,默认不修改源文件(需-i选项实现原地修改)。

(一)工作流程

  1. 读取行:从输入流(文件 / 管道 / 标准输入)读取一行,存入模式空间(内存临时区域),记录当前行号。

  2. 执行命令:按sed命令对模式空间中的行执行操作(如替换、删除),可指定行号或模式筛选目标行。

  3. 显示结果:将处理后的行发送到输出流(文件 / 管道 / 标准输出),清空模式空间。

  4. 循环:重复 1-3 步骤,直到输入流处理完毕。

    注:保持空间(hold space)用于暂存数据,不自动清空,需用h、H、g、G

    命令操作,用于跨行数据处理。

(二)基础语法

sed [OPTION] [sed-command] [input-file]
  • OPTION:命令行选项(如-n/-i/-r)。
  • sed-command:具体操作命令(如d/s/p)。
  • input-file:输入文件(不指定则从标准输入读取)。

(三)核心选项

选项功能示例
-n/--quiet取消自动打印模式空间(需p命令显式打印)sed -n '1p' data.txt(仅打印第 1 行,不输出其他行)
-e SCRIPT执行多个sed命令(用分号分隔或多-e联用)sed -e '1d;2d' data.txt(删除第 1、2 行)
-f FILE从文件读取sed命令(每行一个命令)1. echo -e '1d\n2d' > scripts.txt(创建命令文件)2. sed -f scripts.txt data.txt(执行文件中的命令)
-i [SUFFIX]原地修改文件(SUFFIX为备份后缀,如-i.baksed -i.bak 's/root/tank/' test(修改test,备份为test.bak
-r/--regexp-extended支持扩展正则表达式(无需转义()/{}等)sed -r 's/(zhangy)/zhangying/' test(扩展正则分组)
--follow-symlinks原地修改时跟随软链接sed -i --follow-symlinks 's/old/new/' link.txt(处理软链接文件)

(四)核心操作命令

1. 打印(p/P
命令功能示例
p打印模式空间所有内容sed -n '3p' data.txt(打印第 3 行)
P打印模式空间第一行(用于多行模式)sed -n 'N;P' data.txt(读取 2 行,打印第一行)
行号 / 模式寻址按行号或模式筛选目标行- 行号:sed -n '1,3p' data.txt(打印第 1-3 行)- 模式:sed -n '/root/p' test(打印含root的行)- 混合:sed -n '/^root/,3p' test(打印root开头行到第 3 行)
2. 删除(d/D
命令功能示例
d删除模式空间所有内容(不输出)sed '3d' data.txt(删除第 3 行)
D删除模式空间第一行(用于多行模式)sed 'N;D' data.txt(读取 2 行,删除第一行,保留第二行)
行号 / 模式寻址按行号或模式筛选删除行- 行号:sed '1,14d' test(删除第 1-14 行)- 模式:`sed '/false
3. 替换(s/c
命令功能示例
s/旧值/新值/[选项]替换模式空间中的内容(默认分隔符/,可自定义如#/@- 基础替换:sed 's/my/your/' test1.txt(替换每行第一个my)- 全局替换:sed 's/my/your/g' test1.txt(替换每行所有my)- 指定次数:sed 's/my/your/3' test1.txt(替换每行第 3 个my)- 自定义分隔符:sed 's#/root#/home#g' test(替换/root/home,避免/转义)
c 新内容替换整行(用新内容替换目标行)sed '/^root/c hello' test(将root开头的行替换为hello
4. 插入(i/a
命令功能示例
i 内容在目标行上方插入新行sed '/root/i ===iiii===' test(在root行上方插入===iiii===
a 内容在目标行下方插入新行sed '/root/a ===aaaa===' test(在root行下方插入===aaaa===
5. 保持空间操作(h/H/g/G

用于跨行数据暂存与调用,解决 “多行处理” 场景。

命令功能示例
h覆盖保持空间(用模式空间内容替换保持空间)sed -e '/root/h' -e '$G' test(将root行存入保持空间,在最后一行下方插入)
H追加保持空间(将模式空间内容追加到保持空间,换行分隔)sed -e '/root/H' -e '$G' test(追加root行到保持空间,最后一行下方插入)
g覆盖模式空间(用保持空间内容替换模式空间)sed -e '/root/h' -e '/zhangy/g' test(用root行替换zhangy行)
G追加模式空间(将保持空间内容追加到模式空间,换行分隔)sed 'G' test(在每行下方插入空行,因保持空间默认空,追加后换行)
6. 其他常用命令
命令功能示例
y/源字符/目标字符字符转换(一对一替换,长度需一致)sed 'y/si/SI/' tests→Si→I,如This→ThIS
r FILE读取文件内容,插入到目标行下方sed '/^root/r test2.txt' test(在root行下方插入test2.txt内容)
w FILE将模式空间内容写入文件sed -n '/^root/w test3.txt' test(将root行写入test3.txt
q [NUM]退出sedNUM为退出码)sed '2q' test(处理完第 2 行后退出,仅输出前 2 行)
!取反:对未匹配的行执行命令sed -n '/root/!p' test(打印不含root的行)

四、awk 命令

awk是 Linux “三剑客” 之一,核心功能是文本分析与格式化输出,支持变量、循环、数组、函数等编程语言特性,擅长 “按列处理”(如提取字段、统计数据),默认按行读取、按字段分割(默认分隔符为空格 / 制表符)。

(一)工作流程

  1. 执行BEGIN:在读取输入前执行(仅一次),用于变量初始化、打印表头。
  2. 逐行处理pattern{action}:从输入流读取一行,按pattern筛选(如正则 / 条件),匹配则执行action(如打印 / 计算),循环至所有行处理完毕。
  3. 执行END:读取所有行后执行(仅一次),用于输出统计结果、打印表尾。

(二)基础语法

  1. 直接执行:awk [OPTIONS] 'BEGIN{action} pattern{action} END{action}' [FILE]
  2. 脚本文件:awk [OPTIONS] -f script.awk [FILE](从文件读取脚本)

(三)核心选项

选项功能示例
-F fs/--field-separator=fs指定字段分隔符(默认空格 / 制表符)awk -F ':' '{print $1,$6}' /etc/passwd(按:分割,打印第 1、6 字段)
-v var=val/--assign=var=val预定义变量(在BEGIN块前生效)awk -v NUM=10 'BEGIN{print NUM}'(输出10
-f FILE从文件读取awk脚本(每行一个命令)1. vim script.awk(写入BEGIN{print "Hello"})2. awk -f script.awk(执行脚本)
-p PROFILE/--profile=PROFILE生成脚本格式化文件(便于调试)awk --profile -f script.awk > awkprof.out(生成格式化脚本)
-d [FILE]/--dump-variables=[FILE]导出内置变量到文件(默认awkvars.outawk -d(生成awkvars.out,含所有内置变量)

(四)核心内置变量

变量功能示例
$0整行内容awk '{print $0}' employee.txt(打印整行)
$nn个字段(n为正整数,$1为第一字段)awk -F ':' '{print $1}' /etc/passwd(打印用户名,第 1 字段)
NF当前行的字段总数(Number of Fields)awk '{print NF}' employee.txt(打印每行字段数)
NR当前行号(全局,多文件时连续计数)awk '{print NR,$0}' file1 file2(打印行号 + 内容,跨文件连续)
FNR当前文件的行号(多文件时重置,仅对当前文件)awk '{print FNR,$0}' file1 file2(打印行号 + 内容,每个文件从 1 开始)
FS输入字段分隔符(等效-F,默认[[:space:]]awk 'BEGIN{FS=":"}{print $1}' /etc/passwd(按:分割)
OFS输出字段分隔符(默认空格)`awk 'BEGIN{OFS=""}{print $1,$2}’ employee.txt(输出用` 分隔字段)
RS输入记录分隔符(默认换行符\nawk 'BEGIN{RS=","}{print $0}' data.txt(按,分割行)
ORS输出记录分隔符(默认换行符\n`awk 'BEGIN{ORS=""}{print $0}’ data.txt(输出用` 分隔行)
FILENAME当前处理的文件名(BEGIN块中为空)awk 'END{print FILENAME}' employee.txt(输出employee.txt
IGNORECASE正则匹配时忽略大小写(非 POSIX,gawk支持)awk 'BEGIN{IGNORECASE=1}/ROOT/{print $0}' /etc/passwd(匹配root

(五)核心功能与示例

1. 模式匹配(pattern部分)

用于筛选目标行,支持正则、条件、行号等。

模式类型示例功能
正则表达式awk '/root/{print $0}' /etc/passwd打印含root的行
行号awk 'NR==3{print $0}' employee.txt打印第 3 行
行号范围awk 'NR>=2 && NR<=5{print $0}' employee.txt打印第 2-5 行
条件判断awk '$4>23{print $0}' employee.txt打印第 4 字段(年龄)大于 23 的行
模式匹配运算符awk '$2~"张三"{print $0}' employee.txt第 2 字段(姓名)匹配张三的行(~:匹配,!~:不匹配)
2. 动作处理(action部分)

用于处理匹配的行,支持变量、循环、函数等。

(1)变量与计算
  • 自定义变量:无需声明,直接赋值(如count=0)。

  • 算术运算:支持+、-、*、/、%、**

    (幂运算)。

    示例:统计技术部员工人数

    awk '$3=="技术部"{count++} END{print "技术部人数:"count}' employee.txt
    
(2)循环语句

支持for/while/do-while,语法与 C 语言类似。

循环类型示例功能
for循环awk 'BEGIN{for(i=1;i<=5;i++) print i}'循环输出 1-5
while循环awk 'BEGIN{i=1;while(i<=5){print i;i++}}'循环输出 1-5
do-while循环awk 'BEGIN{i=1;do{print i;i++}while(i<=5)}'循环输出 1-5(至少执行一次)
循环控制awk 'BEGIN{for(i=1;i<=10;i++){if(i%2==0) continue;print i}}'输出 1-10 中的奇数(continue跳过偶数)
(3)数组

awk仅支持关联数组(索引可为字符串 / 数字,无需声明大小),常用操作:

  • 创建数组:arr["key"]=value(如arr["张三"]=23)。
  • 遍历数组:for(key in arr) {print key, arr[key]}
  • 删除元素:delete arr["key"]

示例:统计单词出现次数

echo "hello world hello awk" | awk '{for(i=1;i<=NF;i++) count[$i]++} END{for(word in count) print word, count[word]}'
# 输出:hello 2; world 1; awk 1
(4)函数

awk支持内置函数与自定义函数,常用内置函数如下:

函数类别函数功能示例
字符串函数length(str)计算字符串长度awk 'BEGIN{print length("hello")}'(输出5
sub(旧,新,str)替换第一个匹配内容awk 'BEGIN{str="hello";sub("l","x",str);print str}'(输出hexlo
gsub(旧,新,str)替换所有匹配内容awk 'BEGIN{str="hello";gsub("l","x",str);print str}'(输出hexxo
substr(str,start[,len])提取子串(start从 1 开始)awk 'BEGIN{print substr("hello",2,3)}'(输出ell
算术函数int(x)取整(截断小数)awk 'BEGIN{print int(3.8)}'(输出3
sqrt(x)计算平方根awk 'BEGIN{print sqrt(16)}'(输出4
rand()生成 0-1 随机数(需srand()初始化)awk 'BEGIN{srand();print rand()}'(输出随机数)
时间函数systime()生成时间戳(1970-01-01 至今秒数)awk 'BEGIN{print systime()}'(输出时间戳)
strftime(fmt[,ts])时间戳转字符串(fmt为格式符)awk 'BEGIN{print strftime("%Y-%m-%d %H:%M:%S",systime())}'(输出当前时间)
(5)格式化输出(printf

print更灵活,支持自定义格式(如对齐、小数位数),语法:printf "格式符", 变量1, 变量2...

常用格式符:

  • %s:字符串;%d:整数;%f:浮点数;%%:百分号。
  • 对齐控制:%-10s(左对齐,占 10 字符);%10d(右对齐,占 10 字符);%010d(右对齐,补 0)。

示例:格式化输出员工信息

awk 'BEGIN{printf "%-8s %-6s %-6s %d\n","序号","姓名","部门","年龄"} {printf "%-8s %-6s %-6s %d\n",$1,$2,$3,$4}' employee.txt
3. 输入输出重定向

awk支持将结果重定向到文件或管道,语法与 Shell 类似:

重定向方式功能示例
>覆盖写入文件(文件不存在则创建)awk 'BEGIN{print "hello"} > "test.txt"'(写入test.txt,覆盖旧内容)
>>追加写入文件awk 'BEGIN{print "world"} >> "test.txt"'(追加到test.txt末尾)
``管道:将输出传给其他命令`awk ‘BEGIN{print “hello world”}’tr ‘a-z’ ‘A-Z’`(转为大写)
`&`双向管道:读写外部命令`awk 'BEGIN{cmd=“tr a-z A-Z”;print “hello”& cmd; close(cmd,“to”); cmd& getline out; print out}'hello转大写输出HELLO`)

五、工具对比与适用场景

工具核心优势适用场景不适用场景
grep快速筛选行,支持正则,轻量高效1. 查找含特定字符 / 模式的行2. 统计匹配行数3. 递归搜索目录文件1. 复杂文本修改(如替换、插入)2. 按列处理数据
sed非交互式修改文本,支持跨行处理1. 批量替换字符串(全局 / 指定行)2. 删除空行 / 注释行3. 文本插入 / 追加(指定位置)1. 复杂数据统计(如字段计算)2. 格式化输出(如对齐、表头)
awk按列处理,支持变量 / 循环 / 数组,擅长分析1. 提取特定字段(如用户名、家目录)2. 数据统计(如人数、平均值)3. 生成结构化报告(带表头 / 表尾)1. 快速行过滤(效率低于grep)2. 简单文本替换(语法比sed复杂)

协同使用示例:从/etc/passwd中筛选含/bin/bash的用户,提取用户名和家目录,按用户名排序并统计数量

grep '/bin/bash' /etc/passwd | awk -F ':' '{print $1,$6}' | sort | awk 'BEGIN{print "用户名  家目录\n--------"} {print $0;count++} END{print "--------\n共"count"个用户"}'
http://www.dtcms.com/a/458657.html

相关文章:

  • 室内装饰公司网站模板wordpress 主题上传
  • 网站迁移到别的服务器要怎么做人力资源公司简介
  • 第六步:加入日志功能
  • 16.C++三大重要特性之多态
  • 鄂州网站建设网站建设的界面f分
  • 网站添加对联广告代码shine跨境电商平台
  • Linux VScode 安装PHP环境
  • 云速建站与传统网站的区别在线设计装修软件
  • 南安建设局网站wordpress英文模版
  • leaflow 部署openlist 部署教程
  • 成都网站空间创新互联网站建设与管理维护的答案李建青
  • photoprism开源去中心化网络的 AI 照片应用
  • 如何在记事本中做网站链接教务处网站建设方案
  • 管理系统网站模板下载上海国家企业信用网
  • 网站怎么优化关键词南京网站设计公司哪儿济南兴田德润怎么联系
  • 博白建设局网站游戏网站logo制作
  • Linux 命令:readlink
  • 三亚建设局网站网站建设上传视频教程
  • 怎样自己建设一个网站济南建设工程信息网官网
  • 买别人做的网站能盗回吗网站建设国家有补贴吗
  • 企业网站的公司和产品信息的介绍与网络营销关系wordpress使用教程书
  • 出版社网站建设方案宁波seo优化项目
  • 自建站电商外贸网站后台fpt
  • 上海医疗 网站制作建设工程人员押证在哪个网站查
  • 吴恩达机器学习课程(PyTorch 适配)学习笔记:3.1 无监督学习基础
  • 做移动类网站的书推荐2014个人网站备案
  • Trea国际版|海外版下载
  • 宝德科技专业嘉兴网站建设网站姐姐做床戏网站
  • 河池公司做网站最近在线观看免费完整版高清电影
  • 网站开发代理江苏如可建设淘宝链接网站