[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 可以将管道或标准输入(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})~"
参考文献
相关文章
- Linux下逻辑卷LVM的管理和RAID磁盘阵列
- 将Linux默认的OpenJDK替换为Oracle JDK
- linux常用命令
- Linux系统中如何通过颜色分辨文件类型
- Linux基础:systemctl和journalctl常用命令
- linux Systemd详解
- Linux 查看端口常用命令
- Linux有问必答:如何修复Chrome的"Your profile could not be opened correctly"
- 在 Kali Linux 环境下设置蜜罐
- linux 【监控io】iotop命令详解
- Java 操作 Linux 服务器 上传文件并执行脚本
- linux安装字体方法
- linux进程互斥等待
- LINUX常用操作命令和命令行编辑快捷键
- Linux应用开发(二十二)——U-Boot的常用命令
- 大数据学习——linux常用命令(一)
- linux内核中socket的创建过程源码分析(详细分析)
- Linux常用命令大全
- docker安装教程(windows和linux[centos8])
- 优化Linux下的内核TCP参数以提高系统性能
- Linux 之 Ubuntu 上 Vim 的安装、配置、常用命令的简单整理
- linux下安装nginx以及常用命令指南
- 每天一个linux命令(19):Linux 目录结构
- linux常用命令—关机重启命令