![](/img/trans.png)
[英]How to print the next word after a found pattern with grep,sed and awk?
[英]How to use awk to print “hello” if pattern is found
我想在制表符分隔的.txt文件中搜索模式 ,如果在一行中找到該模式,請打印該行的第三個字段。
我只需要查找該行中的第一個匹配項,因為該模式肯定只出現一次。
.txt文件的結構:
XXX01 foo target1
XXX02 bar target2
XXX03 foobar target3
我的第一個想法是,如果找到模式,則打印“ hello”,如果我的代碼有效,則進行控制。 我還包括了傳遞給bash腳本的變量的回顯。
命令行調用和腳本:
$ ./script.sh file.txt foo
#!/bin/bash
file=$1
pattern=$2
awk '/"$pattern"/{print "hello"}' "$file"
echo "$file"
echo "$pattern"
就我發現它為awk而言,要打印第三個字段,我必須將打印“ hello”替換為打印“ \\ $ 2”。
但是打印“ hello”已經不起作用:
實際輸出:
file.txt
foo
所需的輸出:
hello (respectively target1)
file.txt
foo
而且我還確定,“ foo”是否在file.txt中
#!/bin/bash
awk -v p="$2"'$2=="$p"{print "hello",$3}' "$1"
echo "$1"
echo "$2"
新的輸出:
awk: 1:unexpected character '.'
file.txt
foo
我相信您想要類似的東西:
$ ./script.sh file.txt foo
#!/bin/bash
file=$1
pattern=$2
awk -v pattern=$pattern'$2==pattern{print "hello",$3}' "$file"
echo "$file"
echo "$pattern"
這里我們擺脫了循環,因為awk
在向每個記錄提供文件時都會檢查每個記錄。 我們還使用-v
標志將$pattern
變量傳遞到awk
腳本中。 然后,我們檢查第二個字段$2
是否為pattern
並打印"hello"
以及第三個字段$3
的內容。
您可以將awk
條件更改為$2~/pattern/
以真正利用正則表達式,但是我懷疑它會打印出第一行和第三行,因為foo
顯示在這兩個行中。
如果要檢查模式是否在行中的任何位置,則可以刪除$2~
所以它只是'/pattern/{print "hello",$2}
。
看:
$ x="foo"'bar' && echo "$x"
foobar
$ x="foo" 'bar' && echo "$x"
-bash: bar: command not found
您的腳本是:
awk -v p="$2"'$2=="$p"{print "hello",$3}' "$1"
因此,請猜測在-vp="$2"
和'$2=="$p"
之間是否沒有空格。 正確,是將它們串聯起來,所以不要那樣做-添加一個空格:
awk -v p="$2" '$2=="$p"{print "hello",$3}' "$1"
出乎意料的.
順便說一句是.
在awk試圖將字符串file.txt
評估為字符串時,由於連接將實際腳本消耗到p
的賦值中,因此在文件名file.txt
。
現在要在比較中實際使用變量p
,您必須將其用作變量,而不是將其放在字符串中:
awk -v p="$2" '$2==p{print "hello",$3}' "$1"
以上只是回答您有關語法錯誤的問題。 要實際執行您想執行的操作,需要以下操作之一,具體取決於您要匹配的是字符串還是正則表達式,以及需要部分匹配還是完全匹配:
awk -v p="$2" '$2==p{print "hello",$3}' "$1"
awk -v p="$2" '$2~p{print "hello",$3}' "$1"
awk -v p="$2" '$2~"\\<"p"\\>"{print "hello",$3}' "$1"
或其他解決方案,具體取決於您到目前為止尚未說明的要求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.