[Linux]常用命令之【nl/sed/awk/wc/xargs/perl】
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 可以将管道或标准输入(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})~"

参考文献
- nl
- sed
- sed 命令 - 菜鸟教程
- wc
- xargs
- Linux:使用awk命令获取文本的某一行,某一列 - CSDN
- shell脚本文本替换 - CSDN
- Windows 下 使用 GitBash 批量转换文本文件编码及批量添加文本行 - CSDN
[Linux]常用命令之【nl/sed/awk/wc/xargs/perl】的更多相关文章
- linux常用命令简单介绍(netstat,awk,top,tail,head,less,more,cat,nl)
1.netstat netstat -tnl | grep 443 (查看443端口是否被占用) root用户,用netstat -pnl | grep 443 (还可显示出占用本机443端口的进程P ...
- linux常用命令:nl 命令
nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...
- linux常用命令(9)nl命令
nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...
- Linux常用命令 - nl命令详解
21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 显示行 ...
- 【Linux】Linux 常用命令汇总
查看软件xxx安装内容:dpkg -L xxx 查找软件库中的软件:apt-cache search 正则表达式 查找软件库中的软件:aptitude search 软件包 查找文件属于哪个包:dpk ...
- linux 常用命令--------雪松整理
linux 常用命令--------雪松整理 博客: http://hi.baidu.com/quanzhou722/blog错误在所难免,还望指正!========================= ...
- Linux常用命令大全(全面)
笔者在这篇文章中跟大家分享一下接近 100 个 Linux 常用命令大全,希望可以帮助到大家. 1.ls [选项] [目录名 | 列出相关目录下的所有目录和文件 1 2 3 4 5 6 7 8 9 1 ...
- 1、linux常用命令的英文单词缩写
1.linux常用命令的英文单词缩写 命令缩写: ls:list(列出目录内容) cd:Change Directory(改变目录) su:switch user 切换用户 rpm:redhat pa ...
- Linux常用命令全称
Linux常用命令全称 pwd:print work directory 打印当前目录 显示出当前工作目录的绝对路径 ps: process status(进程状态,任务管理器) 常用参数: ...
- Linux 常用命令大全2
Linux 常用命令大全 [帮助命令] command —help man command man 2 command 查看第2个帮助文件 man -k keyword 查找含有关键字的帮助 info ...
随机推荐
- .net core 接收并存储客户端上传的文件
1 文件是上传到Host,非上传到阿里云OSS 2 在Program.cs或StartUp中使用静态文件的中间件 public void Configure(IApplicationBuilder a ...
- xShell执行js脚本
var CMD = 'ls'; var INTERVAL = 1; var MAX = 5; var CR = String.fromCharCode(13); var LF = String.fro ...
- 基础篇:windows常用命令
1. windows常用系统命令 cd [进入目录] dir [列出当前目录文件] echo + 打印内容 [打印命令] echo 123 > 1.txt [打印内容到文本] type + 文件 ...
- 十大经典排序之归并排序(C++实现)
归并排序 思路:(分而治之的思想) 1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列: 2.设定两个指针,最初位置分别为两个已经排序序列的起始位置: 3.比较两个指针所指向的元 ...
- FCC 高级算法题 验证电话号码
Validate US Telephone Numbers 如果传入字符串是一个有效的美国电话号码,则返回 true. 用户可以在表单中填入一个任意有效美国电话号码. 下面是一些有效号码的例子(还有下 ...
- Calendar 获取当前月份最后一周
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class Ca ...
- CF1430
CF1430 那个博客搭好遥遥无期. A: 看代码. #include<bits/stdc++.h> using namespace std; int main() { int t;sca ...
- 对表单input输入框加特殊符号(正斜杠和反斜杠)校验
<p>图片名称:</p><input type="text" name="afterName" style="heigh ...
- Javascript 事件派发 dispatcher
基本使用 基础事件 let event = new Event("click") //新建click事件 node.addEventListener("click&quo ...
- linux下python程序部署
1.安装python 2.安装virtualenv https://blog.csdn.net/mulangren1988/article/details/59106682 3.指定virtualen ...