在嵌入式linux开发过程中,当开发板启动过程时,首先需要运行一些shell脚本来进行系统配置。我们知道linux一切皆文件,如果对配置文件或log打印信息的获取需要写个程序去读取,必然大大降低了开发效率。本文浅析非常高效的linux shell命令awk在开发工程中的实际应用。
1,从系统命令的打印中获取有用信息。
演示:
上图为开发板网络信息,现在从中获取到ip,netmask
因此,在shell脚本中获取到ip和mask地址,只需下面两行。
ip=$( ifconfig eth0 | grep 'inet addr' | awk -F: '{print $2}' | awk '{print $1}' )
mask=$( ifconfig eth0 | grep 'Mask' | awk -F: '{print $4}' )
分析:
1,命令ifconfig eth0可以获取到网卡eth0对应的网络信息;
2,再讲以上打印通过管道 ' | ' 交给 grep 'inet addr'来处理;
3,通过grep查找到包含“inet addr”的行打印出来,再通过管道交给awk -F: '{print $2}'来处理;
这里的awk -F:的意思是将输入的信息用':'进行分隔,awk缺省参数默认是空格或tab进行分隔的。
'{print $2}'表示打印出以:分隔后的第二个字段,即192.168.1.101 Bcast。
$0表示获取整行,$2,$3...表示获取第2,3个字段信息。
4,然后将以上打印再进行一次 awk '{print $1}',即可获取到192.168.101。
其中,grep是非常高效的查找命令,可以在liux终端 grep看下用法。
awk是非常强大的文本分析工具。可以在linux终端输入awk查看用法
2,从文本中获取到某行指定位置的信息。
演示:
这里以classInfo.ini文件举例。
要从文件中获取到wangwu的值复制给shell中的变量进行系统配置。
只需要在shell脚本中使用
readIni=`awk -F '=' '/\['class2'\]/{a=1}a==1&&$1~/'wangwu'/{print $2;exit}' ./classInfo.ini`
1,其中/\['class2'\]/{a=1},意思为awk一行行处理classInfo.ini文件过程中,当匹配到'[class2]'时,设a=1;
2,a==1&&$1~/'wangwu'/ {print $2;exit}意思为当a==1,并且接下来获取到的行包含/'wangwu'/,即(wangwu=300)根据前面-F '=' 分隔后,打印print $2,即第二个字段信息($1为wangwu,$2为300)。
在shell脚本中一般将以上命令封装成一个函数来调用,即:
function __readINI() {
INIFILE=$1; SECTION=$2; ITEM=$3
_readIni=`awk -F '=' '/\['$SECTION'\]/{a=1}a==1&&$1~/'$ITEM'/{print $2;exit}' $INIFILE`
echo ${_readIni}
}
调用时直接使用:
value=$( __readINI ./classInfo.ini class2 wangwu)