ボーンシェルとawkの組み合わせ


0

これは私の実際のファイルWASfileです

#!/bin/sh
sed -i '/^ *$/d' WASfile  
sed -i -e '/user=/,/group_1=/{w /tmp/1' -e 'd}' /home/wasdm/WASfile;  
Script to Add  
read -p "Press [Enter] to continue for Installation"  

ここで、上記の[ 追加するスクリプト]に次のスクリプトを配置してから、WASfileをスクリプト(多くのスクリプトまたはコマンドの組み合わせ)として実行します。

#!/usr/bin/awk -f  

BEGIN   { FS="=" }  
NR==FNR { a[$1]=$0; next }  
$1 in a { $0=a[$1] }  
/^#/    { var=$1; sub(/^#/, "", var); if(var in a) { $0=a[var] } }  
1    

以下のように組み合わせて使用​​したり、両方のスクリプトを組み合わせるより良い方法を使用したいと思います。

#!/bin/sh  
sed -i '/^ *$/d' WASfile  
sed -i -e '/user=/,/group_1=/{w /tmp/1' -e 'd}' /home/wasdm/WASfile;  
#!/usr/bin/awk -f  

BEGIN   { FS="=" }  
NR==FNR { a[$1]=$0; next }  
$1 in a { $0=a[$1] }  
/^#/    { var=$1; sub(/^#/, "", var); if(var in a) { $0=a[var] } }  
1  
read -p "Press [Enter] to continue for Installation"  

スクリプトを実行できません。

そこで、AWKscriptを別のファイルに抽出して、そのAWKscriptを実行しようとしました。ただし、問題は抽出後、メインスクリプトWASfile自体が破損または失敗することです。

#!/bin/sh
sed -i '/^ *$/d' WASfile;
sed -i -e '/\/usr\/bin\/awk/,/baba/{w 1' -e 'd}' WASfile;
#!/usr/bin/awk -f

BEGIN   { FS="=" } NR==FNR { a[$1]=$0; next } $1 in a { $0=a[$1] } /^#/    { var=$1; sub(/^#/, "", var); if(var in a) { $0=a[var] } } 1
baba
read -p "Press [Enter] to continue for Installation"

以下のように

#./WASfile
sed: -e expression #1, char 24: missing command
./WASfile: line 6: BEGIN: command not found
./WASfile: line 7: {: command not found
./WASfile: line 7: next: command not found
./WASfile: line 8: in: command not found
./WASfile: line 9: syntax error near unexpected token `/^#/,'
./WASfile: line 9: `/^#/    { var=$1; sub(/^#/, "", var); if(var in a) { $0=a[var] } }  '

最初のスクリプトは呼び出されたファイル内に格納されているWASfileが、同じスクリプト内で同じ名前のファイルを2回(WASfileおよびフルパスで/home/wasadm/WASfile)編集していると説明します。同じファイルである必要があり、本当に自己修正コードを作成したいですか?または、スクリプトと編集中のファイルに同じ名前を非実用的に使用しましたか?---自己修正コードを使用しないよう強くお勧めします。正しく機能させるには、さらに多くの知識が必要です。
パブーク

回答:


0

あなたの質問から、最初のスクリプトはというファイルに保存されていることがわかりますWASfile。スクリプトに実行可能ビットが設定されていることを確認する必要があります。

chmod a+x WASfile

次に、スクリプトを実行できます./WASfilePATHデフォルトでは、現在のディレクトリは変数にないため、現在のディレクトリ./または絶対パスのいずれかのパスを明示的に指定する必要があります/home/wasadm/WASfile

同じことがAWKスクリプトにも当てはまります。それを実行可能にし、指定されたパスで呼び出します。

WASfileスクリプトコマンドラインからと同じようにそれを呼び出すことができます。コマンドラインもシェルです-firsスクリプトを実行するシェルと同じか類似しています。

#!/bin/sh
sed -i '/^ *$/d' WASfile
sed -i -e '/user=/,/group_1=/{w /tmp/1' -e 'd}' /home/wasadm/WASfile
/path/to/the/AWKscript inputfile1 inputfile2 >outputfile1
read -p "Press [Enter] to continue for Installation"

上記のコードは、ディレクトリAWKscript内に保存されているスクリプトを実行します/path/to/the。自己記述的な名前を持つパラメータとしてファイルを使用します。必要なファイルをそこに置きます。

別のオプションは、awk明示的に呼び出すことです。このような場合、ファイルの実行可能ビットを有効にする必要はありません。

awk -f /path/to/the/AWKscript

質問の最後のコードは機能しません

最後のコードで示した組み合わせは機能しません。Unixライクなシステムは、単一のインタープリターによって単一の実行可能ファイルを実行するように設計されています。


私はあなたの提案に従って質問を編集しました。チェックしてください。
user2692634

@ user2692634:返信を読んでください。まだ適用されます。あなたが何かを理解していないなら、私に知らせてください。sedコードに関しては、以前のコメントが引き続き適用されます。
pabouk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.