Basic pacman and awk commands to find conflicting packages

If you type pacman -Qi <package name> you get information about the package in question. Within this information you get if this package conflicts with another installed package.

If I run pacman -Qdt I will get a list of packages that are no longer required as dependencies.

pacman -Qdt
clutter-gst2 2.0.18-1
geoclue 0.12.99-2
java-rxtx 2.2pre2-3
libftdi-compat 0.20-3
libirman 0.5.2-1
ppl 1.2-1
pth 2.0.7-5
python-path 8.2.1-1
python2-atspi 2.20.2-1
python2-path 8.2.1-1
spandsp 0.0.6-1
speech-dispatcher 0.8.5-1
wildmidi 0.4.0-1
wxgtk2.8 2.8.12.1-4
zeitgeist 0.9.16-1

Now if I would like to get the first column of this array I will type the following command.

pacman -Qdt | awk '{print $1}'
clutter-gst2
geoclue
java-rxtx
libftdi-compat
libirman
ppl
pth
python-path
python2-atspi
python2-path
spandsp
speech-dispatcher
wildmidi
wxgtk2.8
zeitgeist

I can now use nested awk and assign to the inner awk to execute a shell command using the sh -x. I will use the -k switch to verify the presence of the files installed by the package.

pacman -Qdt | awk '{print $1}' | awk '{print "pacman -Qk " $1}' | sh -x
clutter-gst2: 47 total files 0 missing files
geoclue: 109 total files 0 missing files
java-rxtx: 20 total files 0 missing files
libftdi-compat: 16 total files 0 missing files
libirman: 30 total files 0 missing files
ppl: 28 total files 0 missing files
pth: 17 total files 0 missing files
python-path: 19 total files 0 missing files
python2-atspi: 77 total files 0 missing files
python2-path: 18 total files 0 missing files
spandsp: 157 total files 0 missing files
speech-dispatcher: 111 total files 0 missing files
wildmidi: 36 total files 0 missing files
wxgtk2.8: 755 total files 0 missing files
zeitgeist: 72 total files 0 missing files

A small trick is to use tr to alternate the format of the output to a single line. By doing so I can specify which package I would like to get to the output.

pacman -Qdt | awk '{print $1}' | tr '\n' ' ' | awk '{print "pacman -Ql " $4}' | sh -x
libftdi-compat usr
libftdi-compat usr/bin
libftdi-compat /usr/bin/libftdi-config
libftdi-compat usr/include
libftdi-compat /usr/include/ftdi.h
libftdi-compat /usr/include/ftdi.hpp
libftdi-compat usr/lib
libftdi-compat /usr/lib/libftdi.so
libftdi-compat /usr/lib/libftdi.so.1
libftdi-compat /usr/lib/libftdi.so.1.20.0
libftdi-compat /usr/lib/libftdipp.so
libftdi-compat /usr/lib/libftdipp.so.1
libftdi-compat /usr/lib/libftdipp.so.1.20.0
libftdi-compat usr/lib/pkgconfig
libftdi-compat /usr/lib/pkgconfig/libftdi.pc
libftdi-compat /usr/lib/pkgconfig/libftdipp.pc

Finally, to get the list of all packages and their conflicting packages I will pass the output to another awk which looks in the first, second and fourth column for the keywords "Name" and "Conflicts". Notice the in the second awk I have used $0 which indicates that I will get as input everything. This is a requirement because I have altered the format of the list to a single line using tr, which means that I have a bunch of columns.

pacman -Qdt | awk '{print $1}' | tr '\n' ' ' | awk '{print "pacman -Qi " $0}' | sh -x | awk '{print $1 "\t" $3 "\t" $4}' | grep "^Name\|^Conflicts" | column -t -s ':'
Name clutter-gst2  
Conflicts   clutter-gst<=2.0.14
Name geoclue  
Conflicts   None
Name java-rxtx  
Conflicts   None
Name libftdi-compat  
Conflicts   None
Name libirman  
Conflicts   None
Name ppl  
Conflicts   None
Name pth  
Conflicts   None
Name python-path  
Conflicts   None
Name python2-atspi  
Conflicts   pyatspi
Name python2-path  
Conflicts   None
Name spandsp  
Conflicts   None
Name speech-dispatcher  
Conflicts   None
Name wildmidi  
Conflicts   None
Name wxgtk2.8  
Conflicts   None
Name zeitgeist  
Conflicts   zeitgeist-datahub

Now to make the above look better you can use column, and sed commands.

pacman -Qdt | awk '{print $1}' | tr '\n' ' ' | awk '{print "pacman -Qi " $0}' | sh -x | awk '{print $1 "\t" $3 "\t" $4}' | grep "^Name\|^Conflicts" | column -x -s ':' | sed -r -e 's/\b(Name|Conflicts)\b//g' | tr '\t' ' ' | tr -d ':'
clutter-gst2 clutter-gst<=2.0.14
geoclue None
java-rxtx None
libftdi-compat None
libirman None
ppl None
pth None
python-path None
python2-atspi pyatspi
python2-path None
spandsp None
speech-dispatcher None
wildmidi None
wxgtk2.8 None
zeitgeist zeitgeist-datahub
pacman -Qdt | awk '{print $1}' | tr '\n' ' ' | awk '{print "pacman -Qi " $0}' | sh -x | awk '{print $1 "\t" $3 "\t" $4}' | grep "^Name\|^Conflicts" | column -x -s ':' | sed -r -e 's/\b(Name|Conflicts)\b//g' | tr '\t' ' ' | tr -d ':' | awk '$2 != "None" {print $0}'
clutter-gst2 clutter-gst<=2.0.14
python2-atspi pyatspi
zeitgeist zeitgeist-datahub

If you would like to do the same for all the packages use pacman -Qnq, and add the paste to merge lines in dyads.

pacman -Qnq | awk '{print $1}' | tr '\n' ' ' | awk '{print "pacman -Qi " $0}' | sh -x | awk '{print $1 "\t" $3 "\t" $4}' | grep "^Name\|^Conflicts" | column -x -s ':' | sed -r -e 's/\b(Name|Conflicts)\b//g' | tr '\t' ' ' | tr -d ':' | paste -d " "  - - | awk '$2 != "None" {print $0}'

Summary

  • The awk command take its arguments in columns, use $0 to get everything as input
  • tr can be used to reformat the output in shell scripts, and you can also delete characters using -d
  • sh -x execute commands from standard input, see documentation of set command for the -x switch
  • You can format the output in columns using the column command
  • sed -e is used for standard input
  • paste is used to merge lines

Latest posts