shell 读取文件第几行 第几列的值

本文介绍了一个使用Shell脚本来读取特定格式文件的例子,展示了如何通过cat、awk和while read命令组合来提取文件中的数值数据,并提供了具体的脚本实现及运行结果。

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



1 .  问题:  读取 list文件(内容如下) 中 NO1  和NO2 的值



 platform                      NO1            NO2
 --------------------         -----------    -----------
 AIX_64                              1          20
 NT_X64                             2          21
 LINUX_X64                       3          22
 HPIA_64                           4           23
 SOLARISX64                    5          24
 LINUXPPC64                    6          25
 SOLARIS_64                    7           26



2.  脚本 


cat list| awk 'NR>2' | while read platform  NO1  NO2
do
    echo $NO1"   "$NO2
done





#NR>2  表示从第三行读取

#while read platform  NO1  NO2   这三个参数必须有,

如果只有   while read NO1  NO2 , 那么输出结果 NO1  是 platform的值, NO2  输出的是文件中NO1  和NO2 的值。



3. 输出 结果



                1       20
                2       21
                3       22
                4       23
                5       24
                6       25
                7       26



4.  读取文件的每一行




cat list | while read line
do
     echo ${line}
done



5. 读取文件中某行的列


取list 中AIX_64 对应NO1的值



  newNO=$(grep AIX_64 list|awk '{print $2}')
   echo ${newNO}





#!/bin/bash # 配置参数(可根据需要调整) PID=628 # 目标进程PID INTERVAL=1 # 采集间隔(秒) DURATION=300 # 总采集时长(秒) OUTPUT_FILE="thread_data_$(date +%Y%m%d_%H%M%S).csv" # 检查ADB连接 if ! adb devices | grep -q "device$"; then echo "错误:未检测到连接的设备,请确保ADB已连接" exit 1 fi # 写入CSV表头 echo "timestamp,tid,thread_name,cpu_percent,res_kb" > "$OUTPUT_FILE" echo "开始采集PID $PID 的线程数据,持续 $DURATION 秒,输出至 $OUTPUT_FILE..." # 计算采集结束时间 END=$((SECONDS + DURATION)) # 循环采集数据 while [ $SECONDS -lt $END ]; do TIMESTAMP=$(date +%s%3N) # 毫秒级时间戳 # 核心改进: # 1. 用sed过滤ANSI终端控制字符(去除颜色、光标指令) # 2. 用awk提取有效(过滤标题、空) # 3. 动态解析字段(通过关键字定位,避免固定索引错误) adb shell "top -H -p $PID -d 0.1 -n 1" 2>/dev/null | \ sed -r "s/\x1b\[[0-9;]*m//g" | # 移除所有ANSI控制字符 grep -vE "Threads:|Mem:|Swap:|TID|^$" | # 过滤非线程数据 while read -r line; do # 解析数据(处理空格分隔,提取关键字段) # 示例格式:" 5465 system 20 0 11G 43M 15M S 15.3 0.6 5:35.65 SP:img2tensor ..." # 字段含义(按顺序):TID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ THREAD_NAME ... parts=($line) # 按空格分割为数组(自动合并连续空格) # 容错:跳过字段不足的 if [ ${#parts[@]} -lt 12 ]; then continue fi TID=${parts[0]} CPU=${parts[8]} # %CPU在第9个位置(索引8) RES_STR=${parts[5]} # RES在第6个位置(索引5,如"43M") THREAD_NAME=${parts[11]} # 线程名在第12个位置(索引11) # 转换RES为KB(处理M/K单位,默认0) if [[ $RES_STR =~ ([0-9.]+)([MK]) ]]; then VALUE=${BASH_REMATCH[1]} UNIT=${BASH_REMATCH[2]} if [ "$UNIT" = "M" ]; then RES_KB=$(echo "$VALUE * 1024" | bc | awk '{printf "%.0f", $0}') elif [ "$UNIT" = "K" ]; then RES_KB=$(echo "$VALUE" | bc | awk '{printf "%.0f", $0}') fi else RES_KB=0 # 无效格式时默认为0 fi # 写入CSV(确保字段完整) echo "$TIMESTAMP,$TID,$THREAD_NAME,$CPU,$RES_KB" >> "$OUTPUT_FILE" done sleep $INTERVAL done echo "采集完成!数据已保存至 $OUTPUT_FILE" 上面脚本对 Threads: 17 total, 3 running, 14 sleeping, 0 stopped, 0 zombie Mem: 7315424K total, 6528388K used, 787036K free, 8032K buffers Swap: 3969620K total, 1024K used, 3968596K free, 1900280K cached 800%cpu 303%user 4%nice 168%sys 303%idle 0%iow 20%irq 2%sirq 0%host TID USER PR NI VIRT RES SHR S[%CPU] %MEM TIME+ THREAD PROCESS 6606 system 20 0 11G 37M 15M S 68.0 0.5 1:43.76 hidl_service@1. vendor.vt.pipeline.hidl_service@1.0-service 6594 system 20 0 11G 37M 15M S 14.0 0.5 0:11.21 SP:img2tensor vendor.vt.pipeline.hidl_service@1.0-service 4931 system 20 0 11G 37M 15M R 14.0 0.5 12:40.99 SP:img2tensor vendor.vt.pipeline.hidl_service@1.0-service 6600 system 20 0 11G 37M 15M R 8.0 0.5 0:11.12 SP:img2tensor vendor.vt.pipeline.hidl_service@1.0-service 6595 system 20 0 11G 37M 15M S 8.0 0.5 0:11.80 SP:img2tensor vendor.vt.pipeline.hidl_service@1.0-service 6596 system 20 0 11G 37M 15M R 8.0 0.5 0:11.03 SP:img2tensor vendor.vt.pipeline.hidl_service@1.0-service 6598 system 20 0 11G 37M 15M S 8.0 0.5 0:11.48 SP:img2tensor vendor.vt.pipeline.hidl_service@1.0-service 6593 system 20 0 11G 37M 15M S 6.0 0.5 0:10.92 SP:img2tensor vendor.vt.pipeline.hidl_service@1.0-service 6597 system 20 0 11G 37M 15M S 5.0 0.5 0:11.87 SP:img2tensor vendor.vt.pipeline.hidl_service@1.0-service 6602 system 20 0 11G 37M 15M S 3.0 0.5 0:02.72 stream_callback vendor.vt.pipeline.hidl_service@1.0-service 6599 system 20 0 11G 37M 15M S 2.0 0.5 0:11.23 SP:img2tensor vendor.vt.pipeline.hidl_service@1.0-service 6601 system 20 0 11G 37M 15M S 2.0 0.5 0:02.66 stream_callback vendor.vt.pipeline.hidl_service@1.0-service 6694 system 20 0 11G 37M 15M S 0.0 0.5 0:00.00 streampipe/6597 vendor.vt.pipeline.hidl_service@1.0-service 6607 system 20 0 11G 37M 15M S 0.0 0.5 0:00.00 streampipe/6597 vendor.vt.pipeline.hidl_service@1.0-service 732 system 20 0 11G 37M 15M S 0.0 0.5 0:00.41 HwBinder:628_2 vendor.vt.pipeline.hidl_service@1.0-service 731 system 20 0 11G 37M 15M S 0.0 0.5 0:00.00 HwBinder:628_1 vendor.vt.pipeline.hidl_service@1.0-service 628 system 20 0 11G 37M 15M S 0.0 0.5 0:00.41 hidl_service@1. vendor.vt.pipeline.hidl_service@1.0-service 对这个命令直接打印的解析有问题,无缘无故换
最新发布
07-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值