作者:邓登
问题的由来是这样的:在ubuntu的/etc/fstab的第一项中是采用的UUID=×××××的格式。我便在想是否可以写一个脚本替换这一行换回到经典的设备名,如/dev/sda1等等。
dengdeng@shangri-la:~/shell$ ls -la /dev/disk/by-uuid/
这样便可以查看到uuid到设备名的对应关系,既然对应关系已经出来了,那么条件算是都备齐了。接着问题就出来了,过去我用到awk和sed这些工具的时候,被替换的内容采用正则表达式表示,而替换的内容却往往是定死了的。而现在的问题是替换的内容是按照一定的映射关系来对应的,虽然我手头有这一张表,但是对于程序来说,它却是没有规律的,只能通过读取它来相对应,这正是我棘手的地方。
先解决眼前的事情:
dengdeng@shangri-la:~/shell$ ls -la /dev/disk/by-uuid/ | grep 2EC0B010C0AFDC79 |awk -F/ ‘{print “/dev/”$3}’
/dev/sda5
测试一下,返回了正确的效果。
#写一个函数:
replace_uuid () {
ls -la /dev/disk/by-uuid/ | grep $1 |awk -F/ ‘{print “/dev/”$3}’
}
#输入uuid号,会返回对应的设备名。
#接着便是要写实现的部分了。
awk ‘BEGIN {FS=”[ \t=]+”}
#FS=”[ \t=]+”}的意思是将空格,TAB键以及等号均作为分隔符,加上“+”是为了使得分隔符可重叠在一起。
#不匹配UUID的行,不做修改,直接全部输出
$1!~/UUID/ {
print $1,$2,$3,$4,$5,$6,$7,$8,$9
}
#匹配UUID的行,就需要替换了,这也是重点,但我却无法实现。
$1~/UUID/ {
“$2=`replace_uuid $2`”
#问题便出在这,我想从这里调用外面的函数,得以替换,可是似乎如何调用都不起作用。当然我试了另外一些办法,都无法完成这个难题。或许使用“cut和paste”是一个办法,但是我却始终相信总有解决之道,只是我还没有开窍。
print $2,$3,$4,$5,$6,$7,$8,$9
}’ /etc/fstab
#总结:虽然这个问题有点钻牛角尖,但是对于我来说,这是一类问题。便是当替代的内容变得不稳定的时候,我不知道如何来实现,不能实现的原因,我想是在于我对awk中调用shell,特别是自定义的函数,我掌握的不好,或许干脆是我没搞明白。

