精通Linux Shell Awk:文本处理与报表生成利器

5星 · 超过95%的资源 需积分: 2 6 下载量 31 浏览量 更新于2024-07-27 收藏 234KB PDF 举报
Linux Shell Awk教程是一个针对Linux系统下Shell编程中awk语言的深入指南,提供了一份中文高清版本。Awk是一种强大的文本处理工具,特别适用于文本分析和报表生成,尽管它的名字古怪(GNU版本称为gawk),但它的功能强大且语法简洁,易于学习。Awk的设计灵感来源于C、Python和bash等语言,但保持了自己的独特性。 文章首先从“捍卫awk”开始,澄清了关于awk的一些误解,指出尽管其名称不吸引人,但其实这是一种非常实用且高效的语言,尤其适合处理大量文本数据。作者强调了awk在文本处理任务中的优势,如它的灵活性和特定于文本操作的特性。 “第一个awk”章节引导读者通过实践来理解awk的基本概念。用户被指导在命令行中运行`$awk '{print}' /etc/passwd`命令,这个例子展示了如何使用awk读取文件(在这个例子中是/etc/passwd),并对每一行执行print命令,输出结果类似于`cat /etc/passwd`的效果。这是理解awk的基本工作流程的关键步骤,即awk读取输入文件,对每一行应用预定义的规则或函数,并将结果输出。 后续章节会逐步深入,讲解awk的其他核心概念,包括但不限于: 1. **多个字段**:awk能处理文本中的多个字段,每个字段由特定的分隔符分开。 2. **外部脚本**:awk支持编写外部脚本,使得复杂逻辑可以组织在一个单独的文件中,提高代码的可维护性和复用性。 3. **BEGIN和END块**:这两个特殊区域分别在开始和结束处理所有记录之前或之后执行,用于初始化和清理工作。 4. **规则表达式和块**:awk的核心是规则(pattern-action pairs),它们定义了如何处理输入的数据。 5. **条件语句**:awk提供了if-else语句,允许基于条件执行不同的动作。 6. **数值变量**:awk处理数字数据的能力,包括算术运算和自增、自减等操作。 7. **字符串化变量**:awk能够将数值转换为字符串,便于格式化输出。 8. **众多运算符**:awk支持多种运算符,用于比较、逻辑运算和算术计算。 9. **字段分隔符**:awk默认使用空格分隔字段,但可通过设置`FS`变量改变这个行为。 10. **字段数量**:awk能够访问记录中的任何字段,通过$1, $2, ...等表示。 11. **记录号**:awk中的记录是按行计数的,可以通过`NR`变量访问当前处理的记录编号。 12. **参考资料**:文章提供了一些额外的学习资源,帮助读者进一步探索awk的世界。 13. **作者简介**:作者Daniel Robbins不仅是Gentoo Technologies的总裁兼CEO,也是一位经验丰富的开发者,他将以系列文章的形式逐步揭示awk的强大功能。 14. **读者反馈**:鼓励读者对文章发表意见和评价,以及订阅developerWorks时事通讯,获取更多技术资讯和教程。 这个Linux Shell Awk教程将帮助读者从基础入手,逐步掌握awk语言,使其在日常Linux系统管理、数据分析和报告生成任务中发挥重要作用。

以下shell脚本是什么意思,转成python是什么样的: if [ -s "${UUT_SN[itemloop]}_level3_item.txt" ] ; then format_error_line=() invalid_error_line=() line_count=0 while read itemline do ((line_count++)) if ! grep -iE "^[.+][ ]{1,}pass .+|^[.+][ ]{1,}fail .+" <<<"$itemline" ; then format_error_line[${#format_error_line[@]}]="$line_count" fi #检查三层记录文件里是否有不可识别的符号 line_mark_count=$(awk -F "" '{print NF}' <<<"$itemline") for((line_mark_loop=0;line_mark_loop<line_mark_count;line_mark_loop++)) do line_mark_ascii=$(echo "${itemline:line_mark_loop:1}" | awk 'BEGIN{for(i=0;i<255;i++)a[sprintf("%c",i)]=i}{print a[$0]}') if ! [[ ${line_mark_ascii} -ge 32 && ${line_mark_ascii} -le 126 ]] ; then invalid_error_line[${#invalid_error_line[@]}]="$line_count" continue 2 fi done done <"${UUT_SN[itemloop]}_level3_item.txt" if [ "0" != "${#format_error_line[@]}" ] ; then mv ${UUT_SN[itemloop]}_level3_item.txt ${UUT_SN[itemloop]}_level3_item.old echo "[level3_format] Fail $(date +"%y-%m-%d %H:%M:%S") format error,please check ${UUT_SN[itemloop]}_level3_item.old in line:${format_error_line[@]}" | tee "${UUT_SN[itemloop]}_level3_item.txt" fi if [ "0" != "${#invalid_error_line[@]}" ] ; then [ ! -s ${UUT_SN[itemloop]}_level3_item.old ] && mv ${UUT_SN[itemloop]}_level3_item.txt ${UUT_SN[itemloop]}_level3_item.old echo "[level3_invalid_word] Fail $(date +"%y-%m-%d %H:%M:%S") content invalid word,please check ${UUT_SN[itemloop]}_level3_item.old in line:${invalid_error_line[@]}" | tee "${UUT_SN[itemloop]}_level3_item.txt" fi fi

2023-05-24 上传

用Python改写以下代码for i in $(ls ${contact_dir});do #temp: 1acb_E-by #temp1: 1acb_E temp=$(echo ${i%-*}) temp1=$(echo ${temp%-*}) awk '{if(!a[$6]++) print $6}' ${contact_dir}/${i} >${contact_dir}/${temp}-res.txt for j in $(cat ${contact_dir}/${temp}-res.txt);do cat ${contact_dir}/${temp}-res.vor | awk '$6=='$j'{print $0}' >${patch_dir}/${temp}_patch_${j}.txt value=0 for l in $(awk '{print $2}' ${patch_dir}/${temp}_patch_${j}.txt);do #echo $l res=$(awk '{print $2}' ${surface_dir}/${temp1}_surface.txt) #echo $res if ( echo ${res} | grep -q $l);then value=1 fi done #patch_abs for k in $(awk '{print $2}' ${patch_dir}/${temp}_patch_${j}.txt);do cat ${rsa_dir}/${temp1}_abs.txt | awk '$3=='$k'{print $0}' >>${patch_abs_dir}/${temp1}_patch_${j}.txt done for m in $(awk '{print $2}' ${patch_dir}/${temp}_patch_${j}.txt);do for n in $(awk '{print $2}' ${patch_dir}/${temp}_patch_${j}.txt);do if [ $n -ne $m ];then cat ${contact_dir}/${temp}-res.vor | awk '$2=='$m' && $6=='$n' {print $0}' >>${patch_contact_dir}/${temp1}_patch_${j}.txt fi done done #### abs=$(awk '{sum += $4};END {print sum}' ${patch_abs_dir}/${temp1}_patch_${j}.txt) con=$(awk '{sum += $9};END {print sum}' ${patch_contact_dir}/${temp1}_patch_${j}.txt) psaia=$(echo "$abs*$con" | bc) echo $j $abs $con $psaia >>${patch_psaia_dir}/${temp1}.txt #echo $j $con >>${patch_psaia_dir}/${temp1}_con.txt #### #echo $value if [ $value = 0 ];then #echo ${patch_dir}/${temp}_patch_${j} rm ${patch_dir}/${temp}_patch_${j}.txt fi done done

2023-05-15 上传