您的位置:首页 > 运维架构 > Shell

Linux shell sed awk

2015-11-17 14:41 337 查看

1、我们的平台编译kernel的时候总是要输入项目名称,很麻烦

################################################
## Compile kernel and pack it into boot.img   ##
################################################
#!/bin/sh

PROJECT=$1
echo $PROJECT
if [ "$1" = "" ];then
echo "Use: makeMtk.ini file for the mkkernel project_name"
#exit  修改 sen -n "1p" makeMtk.ini获取makeMtk.ini的第一行数据
#awk '{print $3}'获取第三个参数 
#read LINE 把之前传进来的参数读取出来
sed -n "1p" makeMtk.ini|awk '{print $3}'|while read LINE
do
PROJECT=$LINE
./makeMtk $PROJECT new kernel
./makeMtk $PROJECT remake kernel
echo ./mediatek/build/tools/images/mkbootimg --kernel ./out/Download/flash/kernel_$PROJECT.bin --ramdisk ./out/target/product/$PROJECT/ramdisk.img -o ./out/target/product/$PROJECT/boot.img
./mediatek/build/tools/images/mkbootimg --kernel ./out/Download/flash/kernel_$PROJECT.bin --ramdisk ./out/target/product/$PROJECT/ramdisk.img -o ./out/target/product/$PROJECT/boot.img
done
#编译完成后退出
exit
else
echo "Use: $1 for the project name"
PROJECT=$1
fi
echo ./makeMtk $PROJECT new kernel
./makeMtk $PROJECT remake kernel
echo ./mediatek/build/tools/images/mkbootimg --kernel ./out/Download/flash/kernel_$PROJECT.bin --ramdisk ./out/target/product/$PROJECT/ramdisk.img -o ./out/target/product/$PROJECT/boot.img
./mediatek/build/tools/images/mkbootimg --kernel ./out/Download/flash/kernel_$PROJECT.bin --ramdisk ./out/target/product/$PROJECT/ramdisk.img -o ./out/target/product/$PROJECT/boot.img


看到代码里面我们每次要编译内核的时候都要输入./mkkernel mid713l_lp_lvds mid713l_lp_lvds 是项目名称,我觉得很麻烦。

2、sed读取文件的某一行

读取文件的某一行可以看看sed 这个命令

sed -n “1p” mkkernel 显示文件的第一行

sed -n “1,4p” mkkernel 显示文件第一行到第四行

weiqifa@weiqifa-Inspiron-3847:~/weiqifa/new_tm100/tm100$ sed -n "1p" mkkernel
################################################
weiqifa@weiqifa-Inspiron-3847:~/weiqifa/new_tm100/tm100$ sed -n "1,4p" mkkernel
################################################
## Compile kernel and pack it into boot.img   ##
################################################
#!/bin/sh
weiqifa@weiqifa-Inspiron-3847:~/weiqifa/new_tm100/tm100$


3、 awk截取某一列

awk ‘{print $3}’ 把管道前面的第三列显示出来

weiqifa@weiqifa-Inspiron-3847:~/weiqifa/new_tm100/tm100$ cat makeMtk.ini
project = mid713l_lp_lvds
build_mode = eng
weiqifa@weiqifa-Inspiron-3847:~/weiqifa/new_tm100/tm100$ cat makeMtk.ini |awk '{print $3}'
mid713l_lp_lvds
eng
weiqifa@weiqifa-Inspiron-3847:~/weiqifa/new_tm100/tm100$


4、while read LINE ;do done 读取文件

do done会重新起一个子shell 这是为什么我不能把$LINE传下去的原因

sed -n "1p" makeMtk.ini|awk '{print $3}'|while read LINE
do
PROJECT=$LINE
./makeMtk $PROJECT new kernel
./makeMtk $PROJECT remake kernel
echo ./mediatek/build/tools/images/mkbootimg --kernel ./out/Download/flash/kernel_$PROJECT.bin --ramdisk ./out/target/product/$PROJECT/ramdisk.img -o ./out/target/product/$PROJECT/boot.img
./mediatek/build/tools/images/mkbootimg --kernel ./out/Download/flash/kernel_$PROJECT.bin --ramdisk ./out/target/product/$PROJECT/ramdisk.img -o ./out/target/product/$PROJECT/boot.img
done


5、用set -x set +x调试上面的说法

################################################
## Compile kernel and pack it into boot.img   ##
################################################
#!/bin/sh
set -x
if [ "$1" = "" ];then
echo "Use: makeMtk.ini file for the mkkernel project_name"
#exit  修改 sen -n "1p" makeMtk.ini获取makeMtk.ini的第一行数据
#awk '{print $3}'获取第三个参数 
#read LINE 把之前传进来的参数读取出来
sed -n "1p" makeMtk.ini|awk '{print $3}'|while read LINE
do
PROJECT=$LINE
echo $PROJECT
break
done
echo $PROJECT
#编译完成后退出
#exit
else
echo "Use: $1 for the project name"
PROJECT=$1
fi
echo ./makeMtk $PROJECT new kernel
set +x
#./makeMtk $PROJECT remake kernel
#echo ./mediatek/build/tools/images/mkbootimg --kernel ./out/Download/flash/kernel_$PROJECT.bin --ramdisk ./out/target/product/$PROJECT/ramdisk.img -o ./out/target/product/$PROJECT/boot.img
#./mediatek/build/tools/images/mkbootimg --kernel ./out/Download/flash/kernel_$PROJECT.bin --ramdisk ./out/target/product/$PROJECT/ramdisk.img -o ./out/target/product/$PROJECT/boot.img


输出结果如下

weiqifa@weiqifa-Inspiron-3847:~/weiqifa/new_tm100/tm100$ ./wmkkernel
++ '[' '' = '' ']'
++ echo 'Use: makeMtk.ini file for the mkkernel project_name'
Use: makeMtk.ini file for the mkkernel project_name
++ sed -n 1p makeMtk.ini
++ read LINE
++ awk '{print $3}'
++ PROJECT=mid713l_lp_lvds
++ echo mid713l_lp_lvds
mid713l_lp_lvds
++ break
++ echo

++ echo ./makeMtk new kernel
./makeMtk new kernel
++ set +x
weiqifa@weiqifa-Inspiron-3847:~/weiqifa/new_tm100/tm100$ vim wmkkernel


所以最终我的修改方案是第一种,网上查的办法行不通。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell