zl程序教程

您现在的位置是:首页 >  系统

当前栏目

[Linux]常用命令之【nl/sed/awk/wc/xargs/perl】

Linux 常用命令 awk Perl sed wc xargs
2023-09-27 14:24:41 时间

nl

nl : 在linux系统中用来计算文件中行号.
nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能。

[root@CENTOS7-20200707 ~]# nl -b a -n rz /etc/p【】asswd #内容按行号右对齐补0列出
000001	root:x:0:0:root:/root:/bin/bash
000002	bin:x:1:1:bin:/bin:/sbin/nologin
000003	daemon:x:2:2:daemon:/sbin:/sbin/nologin
000004	adm:x:3:4:adm:/var/adm:/sbin/nologin
000005	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
000006	sync:x:5:0:sync:/sbin:/bin/sync
000007	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
000008	halt:x:7:0:halt:/sbin:/sbin/halt
000009	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
...

[root@CENTOS7-20200707 ~]# nl -b a -n rn /etc/passwd #内容按行号右对齐(不补0)列出
     1	root:x:0:0:root:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6	sync:x:5:0:sync:/sbin:/bin/sync
     7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8	halt:x:7:0:halt:/sbin:/sbin/halt
     9	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
...

[root@CENTOS7-20200707 ~]# nl -b a -n ln /etc/passwd #内容按行号左对齐(不补0)列出
1     	root:x:0:0:root:/root:/bin/bash
2     	bin:x:1:1:bin:/bin:/sbin/nologin
3     	daemon:x:2:2:daemon:/sbin:/sbin/nologin
4     	adm:x:3:4:adm:/var/adm:/sbin/nologin
5     	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6     	sync:x:5:0:sync:/sbin:/bin/sync
7     	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8     	halt:x:7:0:halt:/sbin:/sbin/halt
9     	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
...

sed := Stream Editor(常用于动态替换文本) | tr

sed对文本的处理很强大,并且sed非常小,参数少,容易掌握,他的操作方式根awk有点像。
sed按顺序逐行读取文件。
sed执行为该行指定的所有操作,并在完成请求的修改之后的内容显示出来,也可以存放到文件中。
参数 -i[扩展名], --in-place[=扩展名] 直接修改文件(如果指定扩展名就备份文件)

[root@sdc04 opt]# oldContent="xxx"
[root@sdc04 opt]# newContent="yyy"
[root@sdc04 opt]# fileName="file.txt"
[root@sdc04 opt]# sed -i -e 's/${oldContent}/${newContent}/g' ${fileName}
[root@sdc04 opt]# echo "apple hello world" | sed 's/hello/johnny/g'
apple johnny world

【扩展/延申】cat filename | tr [被替换字符] [替换字符] >> filename1
[root@sdc04 opt]# echo "apple hello world" | tr [a-z] [A-Z]
APPLE HELLO WORLD

【sed带变量的动态参数替换】
[root@sdc04 opt]# str=3535
[root@sdc04 opt]# echo "apple hello world" | sed 's/hello/$str/g'
apple $str world
[root@sdc04 opt]# echo "apple hello world" | sed s/hello/$str/g
apple 3535 world
【补充:变量/shell命令输出的字符串不能带有空格】
[root@sdc04 opt]# echo "apple hello world" | sed s/hello/$(date "+%Y-%m-%d %H:%M:%S %A")/g
sed:-e 表达式 #1,字符 18:未终止的“s”命令
[root@sdc04 opt]# echo "apple hello world" | sed s/hello/$(date "+%Y-%m-%d_%H:%M:%S_%A")/g
apple 2021-01-08_22:50:11_星期五 world
[root@CENTOS7-20200707 ~]# cat ./myfile.txt | grep "johnny" | sed 's/johnny/hello/g' [直接将将文本中出现"johnny"的行中的"johnny"内容全部替换为"hello"]
(格式: sed 's/将被替换的字符/新的字符/g')

[root@CENTOS7-20200707 ~]# cat ./myfile.txt | grep "johnny" | sed -i 's/johnny/hello/g' [直接将将文本中出现"johnny"的行中的"johnny"内容全部替换为"hello"]
(参数-i: 可让sed直接去修改后面接的文件内容而非屏幕输出)
[root@CENTOS7-20200707 ~]# find <targetDirPath> -name *.properties | xargs sed -i 's/old_str/new_str/g' # 替换<targetDirPath>目录下所有名为.properties的文件内字符串old_str为new_str

[root@CENTOS7-20200707 ~]# nl -b a -n rz /etc/passwd | sed '2,5d' # /etc/passwd文件内容按行号右对齐补0列出,且删除第2-5行
000001	root:x:0:0:root:/root:/bin/bash
000006	sync:x:5:0:sync:/sbin:/bin/sync
000007	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
000008	halt:x:7:0:halt:/sbin:/sbin/halt
000009	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
000010	operator:x:11:0:operator:/root:/sbin/nologin
...

awk

awk有3种形式:awk,gawk,nawk。平时所说的awk,其实就是gawk。

  • 按指定分隔符,换行输出
    (1行 => N行)
[root@centos7 ~]# openssl ciphers
ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DH-DSS-AES256-GCM-SHA384:DHE-DSS-AES256-GCM-SHA384:DH-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA256:DH-RSA-AES256-SHA256:DH-DSS-AES256-SHA256:DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:DH-RSA-AES256-SHA:DH-DSS-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:DHE-DSS-CAMELLIA256-SHA:DH-RSA-CAMELLIA256-SHA:DH-DSS-CAMELLIA256-SHA:ECDH-RSA-AES256-GCM-SHA384:ECDH-ECDSA-AES256-GCM-SHA384:ECDH-RSA-AES256-SHA384:ECDH-ECDSA-AES256-SHA384:ECDH-RSA-AES256-SHA:ECDH-ECDSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:AES256-SHA:CAMELLIA256-SHA:PSK-AES256-CBC-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:DH-DSS-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:DH-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-DSS-AES128-SHA256:DH-RSA-AES128-SHA256:DH-DSS-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:DH-RSA-AES128-SHA:DH-DSS-AES128-SHA:DHE-RSA-SEED-SHA:DHE-DSS-SEED-SHA:DH-RSA-SEED-SHA:DH-DSS-SEED-SHA:DHE-RSA-CAMELLIA128-SHA:DHE-DSS-CAMELLIA128-SHA:DH-RSA-CAMELLIA128-SHA:DH-DSS-CAMELLIA128-SHA:ECDH-RSA-AES128-GCM-SHA256:ECDH-ECDSA-AES128-GCM-SHA256:ECDH-RSA-AES128-SHA256:ECDH-ECDSA-AES128-SHA256:ECDH-RSA-AES128-SHA:ECDH-ECDSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:SEED-SHA:CAMELLIA128-SHA:PSK-AES128-CBC-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:DH-RSA-DES-CBC3-SHA:DH-DSS-DES-CBC3-SHA:ECDH-RSA-DES-CBC3-SHA:ECDH-ECDSA-DES-CBC3-SHA:DES-CBC3-SHA:IDEA-CBC-SHA:PSK-3DES-EDE-CBC-SHA:KRB5-IDEA-CBC-SHA:KRB5-DES-CBC3-SHA:KRB5-IDEA-CBC-MD5:KRB5-DES-CBC3-MD5:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:ECDH-RSA-RC4-SHA:ECDH-ECDSA-RC4-SHA:RC4-SHA:RC4-MD5:PSK-RC4-SHA:KRB5-RC4-SHA:KRB5-RC4-MD5

# openssl ciphers | awk 'BEGIN{i=1}{gsub(/:/,",\n");i++;print}' 【按符号`:`分割】
ECDHE-RSA-AES256-GCM-SHA384,
ECDHE-ECDSA-AES256-GCM-SHA384,
ECDHE-RSA-AES256-SHA384,
ECDHE-ECDSA-AES256-SHA384,
ECDHE-RSA-AES256-SHA,
ECDHE-ECDSA-AES256-SHA,
DH-DSS-AES256-GCM-SHA384,
DHE-DSS-AES256-GCM-SHA384,
DH-RSA-AES256-GCM-SHA384,
DHE-RSA-AES256-GCM-SHA384,
DHE-RSA-AES256-SHA256,
DHE-DSS-AES256-SHA256,
DH-RSA-AES256-SHA256,
DH-DSS-AES256-SHA256,
DHE-RSA-AES256-SHA,
DHE-DSS-AES256-SHA,
DH-RSA-AES256-SHA,
DH-DSS-AES256-SHA,
DHE-RSA-CAMELLIA256-SHA,
DHE-DSS-CAMELLIA256-SHA,
DH-RSA-CAMELLIA256-SHA,
DH-DSS-CAMELLIA256-SHA,
ECDH-RSA-AES256-GCM-SHA384,
ECDH-ECDSA-AES256-GCM-SHA384,
ECDH-RSA-AES256-SHA384,
ECDH-ECDSA-AES256-SHA384,
ECDH-RSA-AES256-SHA,
ECDH-ECDSA-AES256-SHA,
AES256-GCM-SHA384,
AES256-SHA256,
AES256-SHA,
CAMELLIA256-SHA,
PSK-AES256-CBC-SHA,
ECDHE-RSA-AES128-GCM-SHA256,
ECDHE-ECDSA-AES128-GCM-SHA256,
ECDHE-RSA-AES128-SHA256,
ECDHE-ECDSA-AES128-SHA256,
ECDHE-RSA-AES128-SHA,
ECDHE-ECDSA-AES128-SHA,
DH-DSS-AES128-GCM-SHA256,
DHE-DSS-AES128-GCM-SHA256,
DH-RSA-AES128-GCM-SHA256,
...
  • F: 指定字段分隔符
[root@CENTOS7-20200707 johnny]# echo "32:34" | awk -F: '{print "max = ",max($1,$2)}
> function max(one,two){
> if(one > two){
>  return one;
> }else{
>  return two;
> }
> }'
max =  34

[root@CENTOS7-20200707 johnny]# echo "aa bb  cc : dd  ee ff" | awk -F ':' '{print $1}' 【F: 指定字段分隔符】
aa bb  cc
  • FS(字段分隔符)

默认: 空格,制表符

$0 表示当前整行内容; $1,$ 2 表示第一个字段,第二个字段
[root@CENTOS7-20200707 johnny]# echo "aa bb cc  dd" | awk '{ print $0}'
aa bb cc  dd

[root@CENTOS7-20200707 johnny]# echo "aa bb cc  dd" | awk '{ print $1}'
aa
  • NR

打印文本第1行

awk 'NR==1{print}' filename

打印文本第二行第一列

sed -n "2, 1p" filename | awk 'print $1'

wc

为统计指定文件中的字节数、单词数、行数, 并将统计结果显示输出

[root@CENTOS7-20200707 johnny]# cat /etc/passwd | wc -l    # 查看passwd文件有多少行
22

[root@CENTOS7-20200707 johnny]# echo "aaa bbb ccc" |wc -w    # 查看输出有多少个单词
3

[root@CENTOS7-20200707 johnny]# cat /etc/passwd | grep "root" | wc -l # 统计指定文件中出现"root"字符的总行数
2

[root@CENTOS7-20200707 johnny]# echo "12344hbjkl" |wc -m # 查看输出有多少个字符
11

xargs := eXtended ARGuments

xargs - 菜鸟教程
xargs - 阮一峰教程

xargs 又称管道命令,构造参数等;
xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理 。
即 把其他命令的给它的数据 传递给它后面的命令作为参数

[root@CENTOS7-20200707 johnny]# find /usr/sbin /7000 | xargs ls -l [找出/usr/sbin下具有特殊权限7000的文件名,并使用ls -l列出详细属性]

[root@localhost ~]# ls | grep .php | xargs -i mv {} {}.bak     [将当前目录下php文件,改名字]
[root@localhost ~]# ls | grep .php | xargs -I {} mv {} {}.bak
(参数-i :  {} 代替 传递的数据)

[root@localhost ~]# find <targetDirPath> -name "*.json" | xargs grep <key-word>   # 查找所有含有<key-word>关键词的<json>文件

[root@localhost ~]# find ./ -name "*.tmp" | xargs -i rm -rf {}  # 删除当前文件夹下的,tmp文件
[root@localhost ~]# find ./ -type f -print0 |xargs -0 rm   # 删除该目录的所有普通文件


[root@localhost ~]# find <targetDirPath> -name *.properties |xargs sed -i 's/old_str/new_str/g' # 替换<targetDirPath>目录下所有名为.properties的文件内字符串old_str为new_str
[root@localhost ~]# find /opt/wydaas/webapps/wydaas/static/dist/js/main.*.js  -name main.*.js | xargs sed -i "s/数据共享资源中心/数据共享中心/g"
[root@localhost ~]# ls -l | xargs -I @@ echo @@

【补充DEMO】

perl

# 字符串不包含/
perl -pi -e "s/目标字符串/替换字符串/g" 目标文件

# 字符串包含/ 则可改成 #
perl -pi -e "s#目标字符串/替换字符串/g" 目标文件

应用:升级Maven Project下的快照版本

#!/bin/bash
# description : 升级本工程下的快照版本
# note :
#  [1] 用于开发者在【本地电脑】端执行本脚本,以进行快速升级本maven工程内多个pom.xml文件的快照版本
#  [2] 要求本工程目录内除了自身工程为快照版本外,不得引入别的快照版本(Snapshot Version)
#  [3] 需在支持 perl / find 的 Linux shell 命令的命令行环境下执行,推荐: Git Bash
# author : johnny zen
# url : https://www.cnblogs.com/johnnyzen
# reference-doc : 
#     https://www.cnblogs.com/johnnyzen/p/15067593.html
#     https://blog.csdn.net/bluewait321/article/details/110643279
# usage : 
#     sample: 1.1.9-SNAPSHOT ==> 1.1.10-SNAPSHOT 
#     cmd : ./upgrade-project-snapshot-version.sh 1.1.9 1.1.10
# create-time : 2023-03-01 17:40

# [1] variables
oldSnapshotVersion="${1}-SNAPSHOT"
newSnapshotVersion="${2}-SNAPSHOT"
projectName="bdp-gateway-service-parent"
fileName="pom.xml"

echo "[INFO] oldSnapshotVersion: ${oldSnapshotVersion}"
echo "[INFO] newSnapshotVersion: ${newSnapshotVersion}"
echo "[INFO] fileName: ${fileName}"

# [2] execution
for filePath in `find ./ -type f -name "${fileName}"` ; 
do 
	echo "[INFO]    perl -pi -e 's#${oldSnapshotVersion}#${newSnapshotVersion}#g' ${filePath}"
	perl -pi -e "s/${oldSnapshotVersion}/${newSnapshotVersion}/g" ${filePath}
done

echo "[INFO] success to upgrade snapshot version at ${fileName} for in the maven project(${projectName})~"

参考文献