Awk

正則表達式不適用於 grep

  • April 22, 2014

我有一個這樣的字元串

TEST="/dev/sda1 on /media/sda1 type vfat (rw,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=cp437,iocharset=iso8859-1,quiet)"

(結果來自mount | grep sda1

我想在哪裡匹配掛載點。我的正則表達式(從這裡採用)是

(?<=on[ \t])(.*)(?=[ \t]type)

但由於某些原因,它不適用於我使用幾個工具(Busybox ash 1.14.2):

echo $TEST | grep -o -e '(?<=on[ \t])(.*)(?=[ \t]type)'

沒有給我任何結果。

echo $TEST | awk 'match($0, /(?<=on )(.*)(?= type)/){print $0}'

返回錯誤awk: bad regex '(?<=on[ ])(.*)(?=[ ]type)': Invalid preceding regular expression

expr match "$TEST" '\(?<=on[ \t]\)\(.*\)\(?=[ \t]type\)'

也返回一個空結果。

我覺得有點傻

Lookarounds 是 perl 正則表達式功能。GNU grep 實現了它們(帶有-P選項)。我不能說是否有任何busybox 命令。

但是,在這種情況下,您只是在“打開”之後尋找工作。選擇其中之一

echo "$TEST" | awk '{for (i=1; i<=NF; i++) if ($i == "on") {print $(i+1); break}}'
echo "$TEST" | sed 's/.*on[[:blank:]]\(.*\)[[:blank:]]type.*/\1/'

引用自:https://unix.stackexchange.com/questions/125969