Ubuntu 14.04 Trusty Tahr。
何百ものxmlファイルを含む「testmag」というディレクトリと、多数のxmlファイルを含むディレクトリがあるとします。 XMLファイルの名前はわかりませんが、そのうちの1つにタグ<dbname>....</dbname>
が含まれています。
前述のタグを含むファイルを見つけて、ターミナルの出力としてタグの値をgrepする方法
これは、一致を含むファイルのファイル名も出力するfind
を使用したソリューションです。
_find . -name "*.xml" -exec grep '<dbname>' {} \; \
-exec echo -e {}"\n" \; \
| sed 's/<dbname>\(.*\)<\/dbname>/\1/g'
_
説明
find . -name "*.xml"
_現在のディレクトリから再帰的にすべてのxmlファイルを検索します-exec grep '<dbname>' {} \;
_パターンごとのファイル検索ごとに_<dbname>
_-exec echo -e {}"\n" \;
_エコーファイル名+改行(_-e
_オプションは、echoに_\n
_を解釈させます)| sed 's/<dbname>\(.*\)<\/dbname>/\1/g'
パイプ出力をsed
にパイプして、_<dbname></dbname>
_タグの間に含まれるフィールドのみを出力します。注1:_echo -e ...
_で出力をフォーマットして、各ファイルの結果を明確にレイアウトできます。必要に応じて、新しい行またはアンダースコアの行を追加します。
注2:各ファイルへのパスは_.
_に相対的に与えられます(例:_./subfolder1/file.xml
_)。絶対パスが必要な場合は、_find $PWD -name ...
_を使用してください。
これらのファイルを含むディレクトリXMLS
があるとします。
cat XMLS/file1
foo bar <dbname>target</dbname> baz
foo foo
cat XMLS/file2
<name>notarget</name>
私はこのコマンドを使用します:
grep -r '<dbname>' XMLS/ | sed 's/.*<dbname>\(.*\)<\/dbname>.*/\1/'
target
ご覧のとおり、これは<dbname>
タグ内の値を返します。 <name>
タグ内の値ではありません。
grep
の-r
フラグは再帰的に検索します。
sed
は、値target
を除くすべての文字列を取り除きます。
適切なXMLパーサーを使用してXMLを解析する:
shopt -s globstar nullglob
for file in **/*.xml; do
dbname=$(xmlstarlet sel -t -v '//dbname' "$file")
[[ -n "$dbname" ]] && printf "%s\t%s\n" "$file" "$dbname"
done