awk打印第n个参数到最后一个技巧/将n行组成一列

本文作者分享工作中对Shell的回顾与整理。介绍了打印第n参数到最后一个参数的方法,指出分隔符标准时用cut命令更好;还讲述将多行文本内容合并为一行的思路,如对NR取余等,最后给出工作实例及效果展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

被工作脱了后腿的贡献者,今天工作中遇到一些小问题,对Shell进行了回顾,将一些小东西进行整理,希望对你工作和学习起到帮助引导作用
================>

开门见山

不做过多装饰了,直接开整------------------------------------------->

打印第n参数到最后一个参数

文本的NF不等,即字段长度不固定,想截取从 3 到 3到 3NF
第一反应是使用循环

[root@localhost ~]# echo "1 2 3 4 5" | awk '{for(i=1;i<3;i++)$i="";print}'
  3 4 5

但其实可以使用CU帽神给的技巧

[root@localhost ~]#echo "1 2 3 4 5" | awk '{$1=$2="";print}'
  3 4 5

如果分隔符比较标准的话(即使用的是统一的标准分隔符),建议还是用cut命令比较嗨皮

[root@jizhong Fri Aug 18 14:05:26 ~]# echo "1 2 3 4 5" | cut -d" " -f3-
3 4 5

帽子神写的从第三个到最后一个

[root@jizhong Fri Aug 18 14:06:47 ~]# echo "1 2 3 4 5" | awk '{$1=$2=""}1'
  3 4 5

其实第2种跟第4种是一样的,只是换用了一些技巧,省略print而已;总的来说,遇到这类情况使用cut会更好一点;使用cut会少去第一个空格,因为awk的默认分隔符为空格
将多行文本内容合并为一行
遇到一个4500行的文本,每行文本只有一段字符串且没有分隔符,现再想要将这个文本进行重组,每50行以逗号为分隔符合成一行
文本内容格式如下

MD_Q9_G1_F
MD_Q9_G1_Ua
MD_Q9_G1_Ub
MD_Q9_G1_Uc
MD_Q9_G1_Uab
MD_Q9_G1_Ubc
MD_Q9_G1_Uca
MD_Q9_G1_Ia
MD_Q9_G1_Ib
MD_Q9_G1_Ic
MD_Q9_G1_Pa
MD_Q9_G1_Pb
MD_Q9_G1_Pc
MD_Q9_G1_Psum
MD_Q9_G1_Qa
MD_Q9_G1_Qb
MD_Q9_G1_Qc
MD_Q9_G1_Qsum
MD_Q9_G1_Sa
MD_Q9_G1_Sb
MD_Q9_G1_Sc
MD_Q9_G1_Ssum
MD_Q9_G1_PFa
MD_Q9_G1_PFb
MD_Q9_G1_PFc
MD_Q9_G1_PF

思路:分隔符对50取余,余数为0时,OFS=\n,否则OFS=,

awk '{ORS=NR%50?",":RS}1'

还有就是使用paste
但是,paste只有将多行合并为一行,但并没有分割的功能
要是有,希望大神指点
同样是对NR取余,但利用printf与print的换行区别来实现需求

awk 'NR%50{printf $0",";next}1'   

当NR取余非零时,执行{printf $0",";next},并跳过1(1表示print)
当NR取余为零时,执行1({print $0})print默认换行
同样是对NR判断,但使用的额是三目运算符

awk '{OFS=",";ORS=NR%50?OFS:RS}1'

满足条件时,输出为OFS(即,)
否则使用RS为输出符
pattern省略或为1,等价于 /.*/

action省略,等价于 { print $0 }

awk将变量传给shell可以用eval, 如 eval $(awk 'BEGIN{print "a=ggg b=3"}')则shell变量$a就是ggg,shell变量$b就是3
工作实例

已脱敏
命令:

1.添加作业重启命令
/bigdata/fada/bin/restart-flink-error.sh -n test -r '/bigdata/fada/bin/start.sh -d test -m streaming -n test -p 3 -s 3 -j 4096m -w 5120m'


2.查看作业运行状态
yarn application -list|grep test |awk '{print $7}'

yarn application -list|grep test |awk '{print $7}'|head -1

3.查看调度作业转态:
1)所有作业:
ps -ef |grep restart-flink-error.sh

2)查看所有作业及进程id:
ps -ef |grep restart-flink-error.sh |awk '{print $2,$11}'

3)查找指定调度作业进程号:
ps -ef |grep restart-flink-error.sh |awk '{print $2,$11}'|grep 'test'|awk '{print $1}'

4)查找调度作业设置时命令:


ps -ef |grep restart-flink-error.sh |awk '{for(i=1;i<9;i++)$i="";print}'

或者:
ps -ef |grep restart-flink-error.sh |awk '{$1=$2=$3=$4=$5=$6=$7=$8="";print}'

5)查找指定作业名的启动定时命令
ps -ef |grep restart-flink-error.sh |awk '{print}'|grep 'test'|awk '{for(i=1;i<9;i++)$i="";print}'

效果展示

隐私问题就只能展示这些了,抱歉!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值